我有一个运行两个不同操作的程序,我想在它们之间共享变量。
目前,我正在使用线程而不是fork进程,但即使我将它们声明为volatile也存在共享变量的问题。
我尝试使用boost:
boost::thread collisions_thread2(boost::bind(function_thread2);
通过将共享变量声明为volatile,但似乎function_thread2()函数无法看到共享变量的变化。
我想做的是:
thread1:
while(true){
//..do somet stuff
check variable1
}
thread2:
while(true){
do some other stuff
check and write on variable1
}
你能建议我在线程之间轻松共享变量的教程或方法吗? 可能是boost库在这种情况下有用吗? 你认为使用fork()更好吗?
我知道我必须使用互斥锁以避免危急情况,但我从未使用它。
答案 0 :(得分:2)
如果使用posix线程库(我推荐),那么使用pthread_mutex_t。
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
然后,在每个线程中,当您想要同步数据访问时:
pthread_mutex_lock(&lock);
//access the data
pthread_mutex_unlock(&lock);
答案 1 :(得分:2)
如果您可以使用boost
,则可以使用boost::mutex
。
// mtx should be shared for all of threads.
boost::mutex mtx;
// code below for each thread
{
boost::mutex::scoped_lock lk(mtx);
// do something
}
答案 2 :(得分:1)
任何类型的互斥锁或解锁都可以。至于你关于volatile的问题,这个关键字是一个很好的做法,特别是在像你这样的多线程程序中。但它不会影响您锁定和解锁的方式。 volatile只是告诉编译器不要优化变量,例如:把它放在一个寄存器里。这是一个非常好的解释: