C 基本打印中的 Pthread
Pthread in C basic print
我正在使用创建子线程的 Pthreads 编写 C 程序。创建子线程后,父线程应该输出两条消息:"parent:begin"然后它应该打印"parent:done"。子线程 "child:begin" 和 "child:done" 相同。我必须确保主线程在生成的(子)线程之前打印出他的第二条消息。我必须遵循实施,但它只会以错误的顺序打印。我想我应该使用标志。任何帮助将不胜感激。
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
volatile int done = 0;
void *child(void *arg) {
printf("child\n");
done = 1;
printf("child:done");
return NULL;
}
int main(int argc, char *argv[]) {
printf("parent: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
while (done == 0); // spin
printf("parent: end\n");
return 0;
}
如果您希望 parent 先打印 done
,那么您应该让 child 线程旋转直到 parent 完成。 (现在 parent 自旋等待 child。)你还应该使用 pthread_join
来确保 child 在主线程 returns 之前完成:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
volatile int done = 0;
void *child(void *arg) {
printf("child: begin\n");
while (done == 0); // spin
printf("child: done\n");
return NULL;
}
int main(int argc, char *argv[]) {
printf("parent: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
printf("parent: done\n");
done = 1;
pthread_join(c, NULL);
return 0;
}
在我的机器上我得到这个输出:
parent: begin
parent: done
child: begin
child: done
目前 done
被两个线程访问,没有任何同步。正确的方法是使用条件变量向 child 发出 parent 已完成打印的信号。这导致 数据竞争。
此外,main()线程先于does完成执行。那样的话,整个进程就死掉了。您可以调用 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("child\n");
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: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
pthread_mutex_lock(&mutex);
done = 1;
printf("parent: end\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(0);
}
我正在使用创建子线程的 Pthreads 编写 C 程序。创建子线程后,父线程应该输出两条消息:"parent:begin"然后它应该打印"parent:done"。子线程 "child:begin" 和 "child:done" 相同。我必须确保主线程在生成的(子)线程之前打印出他的第二条消息。我必须遵循实施,但它只会以错误的顺序打印。我想我应该使用标志。任何帮助将不胜感激。
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
volatile int done = 0;
void *child(void *arg) {
printf("child\n");
done = 1;
printf("child:done");
return NULL;
}
int main(int argc, char *argv[]) {
printf("parent: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
while (done == 0); // spin
printf("parent: end\n");
return 0;
}
如果您希望 parent 先打印 done
,那么您应该让 child 线程旋转直到 parent 完成。 (现在 parent 自旋等待 child。)你还应该使用 pthread_join
来确保 child 在主线程 returns 之前完成:
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
volatile int done = 0;
void *child(void *arg) {
printf("child: begin\n");
while (done == 0); // spin
printf("child: done\n");
return NULL;
}
int main(int argc, char *argv[]) {
printf("parent: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
printf("parent: done\n");
done = 1;
pthread_join(c, NULL);
return 0;
}
在我的机器上我得到这个输出:
parent: begin
parent: done
child: begin
child: done
目前 done
被两个线程访问,没有任何同步。正确的方法是使用条件变量向 child 发出 parent 已完成打印的信号。这导致 数据竞争。
此外,main()线程先于does完成执行。那样的话,整个进程就死掉了。您可以调用 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("child\n");
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: begin\n");
pthread_t c;
pthread_create(&c, NULL, child, NULL); // create child
pthread_mutex_lock(&mutex);
done = 1;
printf("parent: end\n");
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(0);
}