这是与out mutex进行线程同步的正确方法吗?

时间:2013-06-11 23:46:31

标签: memory atomic lock-free barrier

这是没有互斥锁同步线程的正确方法吗? 这段代码应该运行很长时间

#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/memory_order.hpp>
#include <atomic>

std::atomic<long> x =0;
std::atomic<long> y =0;

boost::mutex m1;

// Thread increments
void Thread_Func()
{
    for(;;)
    {
//      boost::mutex::scoped_lock lx(m1);
        ++x;
        ++y;
    }
}

// Checker Thread
void Thread_Func_X()
{
    for(;;)
    {
//      boost::mutex::scoped_lock lx(m1);
        if(y > x)
        {
// should never hit until int overflows
            std::cout << y << "\\" << x << std::endl;
            break;
        }
    }
}

//Test Application
int main(int argc, char* argv[])
{
    boost::thread_group threads;
    threads.create_thread(Thread_Func);
    threads.create_thread(Thread_Func_X);
    threads.join_all();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果不确切知道自己要做什么,很难说这是“正确”的方式。这是有效的代码,虽然有点笨拙。

无法保证“Checker”线程能够看到条件y > x。从理论上讲,它永远不会破裂。在实践中,它会在某个时刻触发,但x可能不是LONG_MIN和y LONG_MAX。换句话说,它不能保证在溢出发生时触发。