您在这里混淆了一些关于同步的基本概念。该pthread_join()
功能不会保证您所想的同步。连接用于在线程执行完成后return
同步线程,即在线程内调用之后。这样,调用线程将等待指定线程完成其执行,这正是您的代码正在做的事情。主线程正在等待:
- 首先,t_1 结束
- 然后,t_2 结束
如果 t_2 在 t_1 之前结束,主线程仍然会被 t_1 阻塞,因为必须遵守这个顺序。当然,它们都不会在你的代码中完成它们的执行,因为它们都陷入了无限循环(while(1)
)。
您尝试实现的目标可以使用多种技术来完成。我建议您使用信号量(如果您想使用POSIX API)或互斥锁(已经在 pthread 库中实现)。
这是一个如何更改代码以获得同步的示例:
void printOne(void* empty){
while(1)
{
sem_wait(&s1); //wait for semaphore s1
printf("One ");
sem_post(&s2); //signal semaphore s2
}
}
void printTwo(void* empty){
while(1)
{
sem_wait(&s2); //wait for semaphore s2
printf("Two\n");
sem_post(&s1); //signal semaphore s1
}
}
sem_t s1, s2; //Declare the semaphores globally, so the threads can access them
int main(){
pthread_t t_1,t_2;
sem_init(&s1, 0, 1); //Initialize s1 with 1
sem_init(&s2, 0, 0); //Initialize s2 with 0
pthread_create(&t_1, NULL,(void *)&printOne,NULL);
pthread_create(&t_2, NULL,(void *)&printTwo,NULL);
pthread_join(t_1,NULL);
pthread_join(t_2,NULL);
exit(0);
}
这样,您的代码可以保证将一条又一条的消息打印到您的输出中:
一二
一二
...
_
_