【发布时间】:2021-08-06 01:45:03
【问题描述】:
在尝试使用信号量实现线程同步问题时,我遇到了一个一般性问题。我不想涉及太多(不相关的)细节,所以我将给出我认为对澄清我的问题很重要的代码。
sem_t *mysema;
violatile int counter;
struct my_info{
pthread_t t;
int id;
};
void *barrier (void *arg){
struct my_info *a = arg;
arg->id = thrid;
while(counter >0){
do_work(&mysem[thrid])
sem_wait(&mysema[third])
display_my_work(arg);
counter--;
sem_post(&mysema[thrid+1])
}
return NULL;
}
int main(int argc, char *argv[]){
int N = atoi(argv[1]);
mysema = mallon(N*(*mysema));
counter = 50;
/*semaphore intialisations */
for(i=0; i<M; i++){
sem_init(&mysema[i],0,0);
}
for(i=0; i<M; i++){
mysema[i].id = i;
}
for(i=0; i<M; i++){
pthread_create(&mysema.t[i], NULL, barrier, &tinfo[i])
}
/*init wake up the first sempahore */
sem_post(&mysema[0]);
.
.
.
我们有一个由 M 信号量组成的数组,初始化为 0 ,其中 M 由用户在命令行中定义。
当所有 M 个线程总共进行了 50 次必要的计算时,我知道我已经完成了。
每个线程自己阻塞,直到前一个线程“sem_post”它。第一个线程将被 init 唤醒。
我的问题是当'''counter = 0'''时线程是否会停止。 他们都看到同一个变量 - 计数器吗?(它是一个全局变量,在 main 中初始化)。
如果线程为零,则第一次生成 ```counter = 49''' 所有其他线程(线程 1、2、...M-1)都看到了吗?
【问题讨论】:
标签: c multithreading synchronization pthreads semaphore