C 基本打印中的 Pthread



我正在使用创建子线程的 Pthreads 编写一个 C 程序。创建子线程后,父线程应输出两条消息:"parent:begin",然后它应该打印"parent:done"。子线程"子线程:开始"和"子线程:完成"相同。我必须确保主线程在生成的(子)线程之前打印他的第二条消息。我必须遵循实现,但它只会以错误的顺序打印。我想我应该使用标志。任何帮助将不胜感激。

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

volatile int done = 0;
void *child(void *arg) {
 printf("childn");
done = 1;
 printf("child:done");
return NULL;
 }
int main(int argc, char *argv[]) {
 printf("parent: beginn");
 pthread_t c;
 pthread_create(&c, NULL, child, NULL); // create child
 while (done == 0); // spin
 printf("parent: endn");
 return 0;
 }

如果您希望父线程先打印done,则应让子线程旋转,直到父线程完成。(现在父母旋转等待孩子。您还应该使用 pthread_join 来确保在主线程返回之前完成子线程:

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

volatile int done = 0;
void *child(void *arg) {
    printf("child: beginn");
    while (done == 0); // spin
    printf("child: donen");
    return NULL;
}
int main(int argc, char *argv[]) {
    printf("parent: beginn");
    pthread_t c;
    pthread_create(&c, NULL, child, NULL); // create child
    printf("parent: donen");
    done = 1;
    pthread_join(c, NULL);
    return 0;
}

在我的机器上,我得到以下输出:

parent: begin
parent: done
child: begin
child: done

目前,两个线程在没有任何同步的情况下访问done。正确的方法是使用条件变量向子级发出信号,表明父级已完成打印。这导致了数据竞赛

此外,main() 线程在 do 之前完成执行。在这种情况下,整个过程将死亡。您可以调用pthread_join(),也可以直接使用 pthread_exit() 退出主线程。

    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
    volatile int done = 0;
    void *child(void *arg) {
      printf("childn");
      pthread_mutex_lock(&mutex);
      while(done == 0)
        pthread_cond_wait(&cond, &mutex);
      pthread_mutex_unlock(&mutex);
      printf("child:done");
      return NULL;
   }
    int main(int argc, char *argv[]) {
      printf("parent: beginn");
      pthread_t c;
      pthread_create(&c, NULL, child, NULL); // create child
      pthread_mutex_lock(&mutex);
      done = 1;
      printf("parent: endn");
      pthread_cond_signal(&cond);
      pthread_mutex_unlock(&mutex);
      pthread_exit(0);
   }

最新更新