我有一个问题。
我正在尝试使用 C++ 创建一些与主线程的线程同步,但如果您通过伪代码回答会更好。我没有使用任何 C++ 框架,也不想使用它们!
这是我的问题:
我有一个在循环中运行一些代码的主线程,以及在循环中运行其他代码的线程(之前不知道有多少,但我可以在需要时将它们保存在某个列表中)。线程(彼此)的代码可以相同或不同,不影响。这是一些基本方案
所有运行的线程都应该在 S1 上满足。然后应该做他们的工作(运行某些东西)并在 S2 点上互相等待。我需要有关同步结构的帮助,我应该将其用于同步线程。
我的计划是有 2 个 FIFO - 新的和可运行的线程。当我创建线程时,它被添加到新线程 FIFO 中。在 S1 点之前的某个地方主线程将所有线程从新线程复制到可运行线程,然后在数量上设置 Barriere可运行的线程,启动所有可运行的线程,并且在 S2 上应该等待 Barriere。然后runlater排队等待S1点。但是我在执行 S1 同步点时遇到了问题。我的尝试以死锁结束。
你能帮我写一些主线程和其他线程的伪代码吗?如何以某种适当的方式同步它们?
编辑:
伪代码:
Main T1 T2
While 1 While 1 While 1
-- S1 -- -- S1 -- -- S1 --
print a print b print c
print d - blocked - print e
- blocked - - blocked - print f
-- S2 -- -- S2 -- -- S2 --
print --- - blocked - - blocked -
End-While End-While End-While
输出应该是这样的:
a
d
b
c
e
f
---
b
a
d
c
e
f
---
总是 block a-f 字母..
需要一些东西来像伪代码一样进行阻塞。不能更具体,不知道我在找什么。
编辑 2: 由于缺少我一直在寻找的答案,我发布了一些用 C++ 编辑的代码,比如我正在使用但不起作用的语法,也许有人可以提供帮助。
main() {
Barrier s1;
Barrier s2;
s1.reset(2);
initThread();
while(1) {
s2.reset(2);
s1.wait();
s1.reset(2);
runSomething();
s2.wait();
runQueue();
}
}
thread() {
while(1) {
s1.wait();
run();
s2.wait();
}
}
我正在考虑使用异步,但比重写代码(不知道结果)要好,我想用这种方式处理这个问题。
最佳答案
这个问题似乎有点太模糊了……不过,有很多方法可以同步线程。你可以使用 mutexes , condition variables , 和 atomics
ISOCPP published a PDF on concurrency这非常彻底。
关于c++ - 并行线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37889088/