zoukankan      html  css  js  c++  java
  • Boost中实现线程安全

    博客转载自: http://www.cnblogs.com/lvdongjie/p/4447142.html

    1 boost原子变量和线程

    #include <boost/thread.hpp>
    using namespace boost;
    using namespace std;
    
    mutex io_mu; // 定认全局互斥变量
    
    /*
    * 模板类: 线程安全的计数器,不可拷贝
    */
    template<typename T>
    class basic_atom : noncopyable
    {
    private:
        T n;
        mutex mu;
    public:
        basic_atom(T x = T()) :n(x) {}
        T operator++() {
            mutex::scoped_lock lock(mu);  //用scoped_lock锁住成员互斥信号变量
            return ++n;
        }
        operator T() { return n; }
    };
    
    typedef basic_atom<int> atom_int;  // 将模板类定义精简名atom_int
    
    int to_interrupt(atom_int& x, const string& str)
    {
        try
        {
            for (int i = 0; i < 9; ++i)
            {
                this_thread::sleep(posix_time::seconds(1));  // 此处应该是子线程sleep1秒
                mutex::scoped_lock lock(io_mu); //io流非线程安全,必须锁住
                cout << str << ": " << ++x << endl;
            }
        }
        catch (thread_interrupted&)
        {
            cout << "thread interrupted" << endl;
            return -1;
        }
    
        return 0;
    }
    
    int main()
    {
        atom_int x;
        thread t(to_interrupt, boost::ref(x), "hello"); // t调用to_interrupt函数,并输出hello x
        this_thread::sleep(posix_time::seconds(3)); //此处应该是主线程睡眠3秒
        t.interrupt();  // 调用线程的中断操作
        t.join();  // 因为线程已中断,所以线程立即返回
    
        getchar();
        return 0;
    }
    t.join()作用
    一句话:把当前线程合并到主线程
    详细点:
    程序的入口点是Main函数
    主程序定义了一个线程,这个线程是执行一个延时输出“--”的函数
    如果没有这句join,那么程序就会一边执行输出“--”一边执行主程序下面的代码
    有了这个join 意思就是大家都在一条线上了,我执行完了才轮到主程序执行。
  • 相关阅读:
    接口与抽象类的区别
    全排列(按字典序)
    设置mysql数据库的密码
    android中操作SQLite注意事项
    Android: Fragment详解
    android设置组件所占的比例
    九度oj 1482:玛雅人的密码
    ACM模板
    洛谷 P1156 垃圾陷阱
    AtCoder Beginner Contest 187 F
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8117062.html
Copyright © 2011-2022 走看看