1
4
这并不是说你用错了互斥锁,只是线程没有达到你期望的效果。操作系统决定哪个线程何时运行(这被称为“调度”),并且代码中没有任何内容强制在循环结束时切换线程;线程继续运行,并重新获取锁。要尝试的一件事是将呼叫添加到
|
2
1
如果更新线程没有其他事情要做,它可以等待互斥对象变为可用。 查看boost::condition_variable。你可以在这里阅读 http://www.boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html 还有这里 Using boost condition variables 如果让更新线程进入睡眠状态是一个问题——它在许多GUI系统上都存在,并且您没有指定正在使用哪一个系统——请考虑从处理线程向更新线程发布消息。(同样,细节取决于您的平台。)该消息可能包含更新显示所需的信息,也可能是“现在是查看的好时机”的通知 如果您确实使用了条件代码,那么处理线程可能会在发出条件信号后,在重新获取锁以为更新线程打开一个大窗口之前屈服。 |
3
1
你可能想看看
boost::condition_variable
,特别是在方法上
|
4
1
在我看来,互斥的原则不是公平,而是正确。互斥体本身无法控制调度程序。有一件事让我很困扰,那就是为什么您选择创建2个线程,使用这种粗粒度的锁定。理论上,你是在并行地运行两件事,但实际上你是在使它们相互依赖/串行。 Pete的想法似乎要好得多(一个函数运行这些draw&update),并且您仍然可以在每个内部函数中使用线程,而不必太担心争用和公平性。 如果你真的希望有两个线程并行运行,那么我可以给你一些提示:
不幸的是,这两种方法都不能解决问题。 |
5
0
正如Dale Wilson和FKaria所建议的那样,我已经用条件解决了这个问题,但我把它用在了相反的方向上。因此,进程线程检查暂停标志,当它被设置时,它会等待一个条件,从而释放锁。显示线程控制暂停标志,它还通过条件通知进程线程来恢复进程线程。代码:(代码基本相同,我用
现在的输出正是我所希望的:
|
da cheng · 在c++11中使用条件变量使程序陷入死锁 6 年前 |
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 6 年前 |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 6 年前 |
Administrator · c#-等待完成2个线程中的1个 7 年前 |
Francis Cugler · 删除Windows库依赖项 7 年前 |
AshR · 程序断断续续地使用main报告与线程本身不同的线程id 7 年前 |
user7256215 · 在macOS内核扩展中有效地使用同步 7 年前 |