2013-06-11 2 views
0

Это правильный способ синхронизации потоков без мьютекса. Этот код должен работать в течение длительного времениЭто правильный способ синхронизации потоков с помощью mutex

#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; 
} 

ответ

0

Не зная точно, что вы пытаетесь сделать, это трудно сказать, что это «правильный» путь. Это правильный код, но это немного странно.

Нет гарантии, что нить «Checker» никогда не увидит условие y > x. Теоретически возможно, что он никогда не сломается. На практике это произойдет в какой-то момент, но x не может быть LONG_MIN и y LONG_MAX. Другими словами, он не может запускаться так же, как происходит переполнение.