如何同步" for"多线程中的循环计数器?

时间:2015-06-26 17:08:31

标签: c++ multithreading mutex sync critical-section

如何同步" for"多线程上的循环计数器?

如果这些多线程程序

void Func(int n){
 for(int i=0; i<n; i++){ //at the same time with other Func()
  cout << i <<endl;
 }
}

void main(){
 std::thread t1(Func(2));
 std::thread t2(Func(2));
 t1.join();
 t2.join();
}

当并行执行Func()时,我想同步&#34; for&#34;循环计数器&#34;我&#34;。

例如,程序可以输出结果

0
1
0
1

但我想总是得到结果

0
0
1
1

我可以吗?

3 个答案:

答案 0 :(得分:1)

如果使用OpenMP来线程化循环,则可以使用#pragma omp barrier语句。

在C ++ 11中,您可以使用condition_variable来阻止所有线程,直到它们到达同一位置。

答案 1 :(得分:0)

这样做的一种方法是使用一些变量让线程协调事物(下面它们是全局变量,只是为了简单起见)。

mutex m;
condition_variable c;
static int index = 0;
static int count = 2;

index变量表示哪个索引是线程,count变量表示索引处仍有多少个线程。

现在你的循环变为:

void Func(int n){
 for(int i=0; i<n; i++){ //at the same time with other Func()
    unique_lock<mutex> l(m);
    c.wait(l, [i](){return index == i;});
    cout << i <<endl;
    if(--count == 0)
    {
        ++index;
        count = 2;
        c.notify_one();
    }
 }
}

以下是完整代码:

#include <thread>
#include <mutex>
#include <condition_variable>
#include <iostream>


using namespace std;


mutex m;
condition_variable c;
static int index = 0;
static int count = 2;


void Func(int n){
 for(int i=0; i<n; i++){ //at the same time with other Func()
    unique_lock<mutex> l(m);
    c.wait(l, [i](){return index == i;});
    cout << i <<endl;
    if(--count == 0)
    {
        ++index;
        count = 2;
        c.notify_one();
    }
 }
}


int main(){
 std::thread t1(Func, 20);
 std::thread t2(Func, 20);
 t1.join();
 t2.join();
}

答案 2 :(得分:0)

您可以使用std:atomic变量并将其传递给所有主题。

rails new

另外,您应该注意,您在示例中创建线程的方式不正确。其次,如果您在多个线程中使用void Func(int n, int & i){ for (; i<n; i++){ //at the same time with other Func() cout << i << endl; } } void main(){ std::atomic<int> counter = 0; std::thread t1(Func, 2, std::ref(counter)); std::thread t2(Func, 2, std::ref(counter)); t1.join(); t2.join(); } ,则每个cout应该使用cout进行保护,因为std::mutex不是线程安全的。