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 意思就是大家都在一条线上了,我执行完了才轮到主程序执行。
  • 相关阅读:
    提升开发效率的十个工具
    JQuery常用函数及功能小结
    jquery-validation 学习总结
    JavaScript:避免代码的重复执行
    18 个最好的CSS框架用于提高开发效率
    如何书写高质量的jQuery代码
    13个 ASP.NET MVC 的扩展
    CSS_LESS 语法/函数详解
    21个值得收藏的Javascript技巧
    JQuery常用功能的性能优化
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8117062.html
Copyright © 2011-2022 走看看