我刚刚编写了以下代码,以更好地了解Threads的工作原理:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int globalVariable = 1;
void *myfunc (void *myvar);
int main (void) {
pthread_t thread1;
int waitms;
while(globalVariable <= 50){
printf("Main function: %d \n", globalVariable);
if (globalVariable==9) {
pthread_create(&thread1, NULL, myfunc, NULL);
pthread_join(thread1, NULL);
}
usleep(300000);
globalVariable++;
}
return 0;
}
void *myfunc (void *myvar){
int waitms;
while(globalVariable<=50) {
printf("Thread1: %d \n", globalVariable);
usleep(300000);
globalVariable++;
}
return 0;
}
代码必须打印在main函数中递增的全局变量的值。当此变量的值为9时,main函数调用一个线程,该线程与原始main函数相同,但不调用另一个线程。
在输出中,我得到主函数的前9个打印件,以下所有打印件都来自线程。他们不应该混在一起吗?我做错了什么?
答案 0 :(得分:0)
不,因为你是{1}} thread1,所以主线程阻塞直到thread1死掉。一旦thread1死掉,它就会恢复,但是thread1已经将globalVariable递增到主线程退出第一个while循环的点。
删除joining
您会看到混合结果,更好的方法是将连接移到join
之外,这样如果主线程退出循环时thread1仍处于活动状态,则等待...到那时候它很可能会死掉,但是你应该确保你的子线程在退出主线程之前完成了。