以下程序的问题是主线程在其他线程有机会显示其结果之前结束。另一个问题是线程显示不正常。
输出必须是:
This is thread 0.
This is thread 1.
This is thread 2. etc.
代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
void *text(void *arg);
long code[] = { 4, 6, 3, 1, 5, 0, 2 }; // Order in which to start threads
int num = 0;
int main()
{
int i;
pthread_t tid[7];
// Initialize random number generator
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);
// Create our threads
for (i = 0; i < 7; i++)
pthread_create(&tid[i], NULL, text, (void*)code[i]);
// Exit main
return 0;
}
void *text(void *arg)
{
long n = (long)arg;
int rand_sec = rand() % (3 - 1 + 1) + 1; // Random num seconds to sleep
while (num != n) {} // Busy wait used to wait for our turn
num++; // Let next thread go
sleep(rand_sec); // Sleep for random amount of time
printf("This is thread %d.\n", n);
// Exit thread
pthread_exit(0);
}
任何人都可以帮助使用互斥锁来解决同步问题吗?
答案 0 :(得分:4)
您可以使用pthread_join
使main
例程等到其他线程完成,例如
int main()
{
int i;
pthread_t tid[7];
// Initialize random number generator
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);
// Create our threads
for (i = 0; i < 7; i++)
pthread_create(&tid[i], NULL, text, (void*)code[i]);
for(i = 0; i < 7; i++)
pthread_join(tid[i], NULL);
// Exit main
return 0;
}
此外,当您开始启用优化时,等待num
成为线程ID的代码可能会出现一些问题。如果num
变量在线程之间共享,则应声明volatile
变量,如下所示:
volatile int num;
那就是说,忙于等待num
这样非常,非常效率低下。您应该考虑使用条件变量在num
更改时通知线程,这样他们就可以检查是否轮到他们一次,如果没有则进行休眠。有关详细信息,请查看所有pthread_cond_*
函数。