C ++ - 线程同步

时间:2017-12-27 09:12:33

标签: c++ multithreading c++11 c++14

我有这个问题

Foo * foo = new Foo();

void A(){
  foo->a();
}

void B(){
  foo->b();
}

void C(){
  foo->reloadAll();
}

一旦我输入方法C并开始重新加载foo,我不想调用A或B.但是,A或B可以一起调用。在那种情况下,我不想锁定任何线程。

如何同步?我可以使用C ++ 14提供的功能。目前,我正在使用原子变量进行主动等待(而loo with sleep),但这并不理想。

编辑:在线程中调用A,B或C是由GUI(用其他语言编写)驱动的,所以我在C ++应用程序中没有真正的线程。

3 个答案:

答案 0 :(得分:4)

看起来像是读者 - 作家的问题。 A和B需要作为读者锁定,C作为作者。看这里:Reader/Writer Locks in C++

答案 1 :(得分:3)

我认为最佳选项是shared_mutex,方法C应该使用唯一锁,但A和B使用共享锁,检查它是否可用。

如果C被锁定,你可以使用try_lock_shared从A和B返回,而不是等待。

答案 2 :(得分:0)

如何使用两个unique locks,一个用于a,一个用于b。当a / b启动时锁定,当a / b结束时分别解锁,c锁定/解锁两者?