c++ - 并行线程同步

标签 c++ multithreading synchronization pseudocode

我有一个问题。

我正在尝试使用 C++ 创建一些与主线程的线程同步,但如果您通过伪代码回答会更好。我没有使用任何 C++ 框架,也不想使用它们!

这是我的问题:

我有一个在循环中运行一些代码的主线程,以及在循环中运行其他代码的线程(之前不知道有多少,但我可以在需要时将它们保存在某个列表中)。线程(彼此)的代码可以相同或不同,不影响。这是一些基本方案 scheme

所有运行的线程都应该在 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/

相关文章:

c - 让多个线程同时读取文件的最佳方法是什么?

C++:线程池比单线程慢?

java - 此类中引用的 Map 是否安全发布?

java - 抽象类中的同步

javascript - 如何在js中生成和同步包含音频的每个节拍信息(bpm)的xml/json文件

c++ - 尝试创建字符串映射并插入项目会导致出现无法理解的错误

c++ - 连续分配大数据有好处吗?

c++ - 合并两个堆的算法

c++ - 从 std::thread 访问类变量

c++ - 在这种情况下如何正确使用std forward