Это правильный способ синхронизации потоков с мьютексом
Это правильный способ синхронизации потоков без мьютекса. Этот код должен работать долго
#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 ответ
Не зная точно, что вы пытаетесь сделать, трудно сказать, что это "правильный" путь. Это действительный код, хотя и немного неопрятный.
Нет никакой гарантии, что ветка "Checker" когда-либо увидит условие y > x
, Теоретически возможно, что оно никогда не сломается. На практике это сработает в какой-то момент, но x может быть не LONG_MIN, а y LONG_MAX. Другими словами, не гарантируется срабатывание, как только происходит переполнение.