线程程序问题

时间:2016-03-06 14:18:43

标签: c multithreading

以下程序的问题是主线程在其他线程有机会显示其结果之前结束。另一个问题是线程显示不正常。

输出必须是:

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);
} 

任何人都可以帮助使用互斥锁来解决同步问题吗?

1 个答案:

答案 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_*函数。