无法使用pthread_barrier_wait()同步posix pthreads

时间:2014-02-18 12:26:13

标签: multithreading parallel-processing pthreads posix

我正在尝试使用pthread_barrier_wait()来同步线程,但是如果LOOP的MAIN中的迭代次数超过1,则线程不会同步。这里写了(s <2)2次迭代我已经提到了下面的输出不同步。

谢谢。

这是我的代码:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>

#define ARRAYSIZE 6
#define NUMTHREADS 3

using namespace std;

// Barrier variable
pthread_barrier_t barr;

unsigned int count = NUMTHREADS;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

struct ThreadData {
    int start, stop, tid;
};

void* squarer(void* td) {
    struct ThreadData* data=(struct ThreadData*) td;
    int start=data->start;
    int stop=data->stop;
    int tid = data ->tid;
    int i,s;

    //MAIN LOOP
    for (s=0; s<2; s++){
        for (i=start; i<stop; i++) {
            printf("thread no. %d is writing: \n", tid);
        }
    // Synchronization point
    int rc = pthread_barrier_wait(&barr);
    if(rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD){
        printf("Could not wait on barrier\n");
        exit(-1);
    }
    for (i=start; i<stop; i++) {
        printf("thread no. %d is executing: \n", tid);
    }   
}
return NULL;
}


int main(void) {
pthread_t thread[NUMTHREADS];
struct ThreadData data[NUMTHREADS];
// Barrier initialization
if(pthread_barrier_init(&barr, NULL, NUMTHREADS)){
        printf("Could not create a barrier\n");
        return -1;  
}
int i; 
int tasksPerThread=(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;

/* Divide work for threads, prepare parameters */
for (i=0; i<NUMTHREADS; i++) {
    data[i].start=i*tasksPerThread;
    data[i].stop=(i+1)*tasksPerThread;

data[i].tid = i;
}
/* the last thread must not go past the end of the array */
data[NUMTHREADS-1].stop=ARRAYSIZE;

/* Launch Threads */
for (i=0; i<NUMTHREADS; i++) {
    pthread_create(&thread[i], NULL, squarer, &data[i]);
}

/* Wait for Threads to Finish */
for (i=0; i<NUMTHREADS; i++) {
    pthread_join(thread[i], NULL);
}

return 0;
}

这是输出:

线程号2是写作:
线程号2是写作:
线程号0是写:
线程号0是写:
线程号1是写作:
线程号1是写作:
线程号1正在执行:
线程号1正在执行:
线程号1是写作:
线程号1是写作:
线程号0正在执行:
线程号0正在执行:
线程号0是写:
线程号0是写:
线程号2正在执行:
线程号2正在执行:
线程号2是写作:
线程号2是写作:
线程号2正在执行:
线程号2正在执行:
线程号0正在执行:
线程号0正在执行:
线程号1正在执行:
线程号1正在执行:

1 个答案:

答案 0 :(得分:0)

根据您编写的代码,该输出会很好地同步。在所有线程完成“写入”步骤之前,没有线程启动“执行”步骤。

此外,如果您希望没有线程启动下一个“写入”步骤,直到所有线程完成上一个“执行”步骤,则需要在“执行”步骤之后再次调用pthread_barrier_wait()