线程锁是否按照被调用的顺序给予线程?例如,我们有三个线程A、B和C,以及一个互斥锁mtx。如果首先是A调用了mtx.lock(),然后是B和C,那么这是否意味着A将首先获取锁,接着是B和C?如果不是,那么我该怎样保证它?
线程锁是否按照被调用的顺序给予线程?例如,我们有三个线程A、B和C,以及一个互斥锁mtx。如果首先是A调用了mtx.lock(),然后是B和C,那么这是否意味着A将首先获取锁,接着是B和C?如果不是,那么我该怎样保证它?
std::mutex
)之外的任何内容。 - Toby Speight我有一个简单的例子来演示这个问题,我创建了3个任务,它们获取锁、打印一些内容,然后等待被加入。你可以尝试一下,将屏障设置为(2),让task_a直接运行,让另外两个任务争夺锁。
我使用boost::barrier确保它们在创建后不会立即开始执行。结果是无法确定的顺序,而不是FIFO。不同的平台会给出不同的结果。点击此处查看演示
std::mutex foo;
boost::barrier bar(3);
void task_a () {
bar.wait();
foo.lock();
std::cout << "task a\n";
foo.unlock();
}
void task_b () {
bar.wait();
foo.lock();
std::cout << "task b\n";
foo.unlock();
}
void task_c () {
bar.wait();
foo.lock();
std::cout << "task c\n";
foo.unlock();
}
int main ()
{
std::thread th1 (task_a);
std::thread th2 (task_b);
std::thread th3 (task_c);
th1.join();
th2.join();
th3.join();
return 0;
}