码迷,mamicode.com
首页 > 编程语言 > 详细

Boost中实现线程安全

时间:2017-12-26 14:18:52      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:typename   输出   thread   pre   blog   lock   www.   char   全局   

博客转载自: 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 意思就是大家都在一条线上了,我执行完了才轮到主程序执行。

 

Boost中实现线程安全

标签:typename   输出   thread   pre   blog   lock   www.   char   全局   

原文地址:https://www.cnblogs.com/flyinggod/p/8117062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!