C++ 并行线程同步

C++ 并行线程同步,c++,multithreading,synchronization,pseudocode,C++,Multithreading,Synchronization,Pseudocode,我有个问题 我试图用C++来创建一些线程,但如果你用伪代码来回答,那就更好了。我不使用任何C++框架,也不想使用它们!p> 我的问题是: 我有一个在循环中运行一些代码的主线程,和在循环中运行其他代码的线程(以前不知道有多少,但我可以在需要时将它们保存在一些列表中)。线程的代码(彼此)可以是相同的,也可以是不同的。下面是一些基本方案 S1上运行的所有线程都应满足要求。然后应该做他们的工作(运行一些东西)并在S2点上等待对方。我需要同步结构方面的帮助,我应该使用同步线程 我的计划是有2个先进先出-

我有个问题

我试图用C++来创建一些线程,但如果你用伪代码来回答,那就更好了。我不使用任何C++框架,也不想使用它们!p> 我的问题是:

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

S1上运行的所有线程都应满足要求。然后应该做他们的工作(运行一些东西)并在S2点上等待对方。我需要同步结构方面的帮助,我应该使用同步线程

我的计划是有2个先进先出-新的和可运行的线程。。当我创建线程时,它会添加到新线程FIFO中。。在S1点之前的某个地方,主线程将所有线程从新线程复制到可运行线程,然后在可运行线程中的线程数上设置Barriere,启动所有可运行线程,在S2上应等待Barriere。然后稍后运行队列并在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
---
始终使用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();
    }
}

我正在考虑使用异步,但比重写代码(不知道结果)更好,我希望以这种方式处理此问题。

我将使用WaitForMultipleObjects(…)-->

其基本思想是:

-让你的主线程一直运行到S1。然后让它与WaitForMultipleObjects(…)一起睡眠

-让其他线程运行,直到它们到达S1,并使用SetEvent(..)引发一个事件。然后使用WaitForSingleObject(..)进行每次睡眠

-一旦其他线程调用了SetEvent(..),您的主线程将被唤醒。一旦唤醒,它将调用SetEvent(..)来唤醒使用WaitForSingleObject(..)等待的其他线程。现在它们将在S1和S2之间同步执行

-然后在到达S2时执行完全相同的同步操作


您不必使用该框架,但这是线程同步的一般设计

这个问题似乎有点太模糊了……不过,有很多方法可以同步线程。你可以用,而且


ISOCPP非常全面。

如果您有支持扩展功能的最新编译器,这可能是一个不错的选择。

尝试在谷歌上搜索无锁数据结构和算法,看起来就像我正在寻找的那样。。只是为了Linux。。。但我可能可以处理它,谢谢..我用监视器(互斥+cv)制作了自己的屏障。。在S2中,我使用了屏障的等待方法,在S1中,我重置了屏障。经过多次迭代后,它遇到了死锁。。但是。。也许我需要更多的锁,但不知道怎么锁。。也许我做错了什么。。