我正在尝试使用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正在执行:
答案 0 :(得分:0)
根据您编写的代码,该输出会很好地同步。在所有线程完成“写入”步骤之前,没有线程启动“执行”步骤。
此外,如果您希望没有线程启动下一个“写入”步骤,直到所有线程完成上一个“执行”步骤,则需要在“执行”步骤之后再次调用pthread_barrier_wait()
。