我编译了这段代码,并且它创建的第99个线程不断创建多个99号的线程。相反,如果我插入1-10或者小的值,那么结果很正常。
这是代码。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER;
pthread_attr_t attr;
void* test(void *a)
{
int i=*((int *)a);
printf("The thread %d has started.\n",i);
pthread_mutex_lock(&m);
usleep(10000);
printf("The thread %d has finished.\n",i);
pthread_mutex_unlock(&m);
pthread_exit(NULL);
}
int main()
{
int i=0,j=0;
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
pthread_t thread[100];
for (i=0;i<100;i++)
{
j=i;
pthread_create(&thread[i],&attr,test,&j);
}
for (i=0;i<100;i++)
pthread_join(thread[i],NULL);
return 0;
}
我得到:
..../*Normal Results*/
The thread 99 has finished.
The thread 99 has finished.
The thread 99 has finished.
The thread 99 has finished.
The thread 99 has finished.
The thread 99 has finished.
为什么会这样?
答案 0 :(得分:1)
每个线程都将相同的指针传递给主线程中的相同堆栈位置(j
)。如果没有进一步的同步,它将在每个线程被调度时未定义,并且在打印其值之前将运行并访问j
。
有很多方法可以打印出每个帖子中的唯一号码,包括
请注意选项3&amp; 4涉及序列化线程的启动。如果你做了很多这样的事情,那么运行多个线程就没什么意义了!
答案 1 :(得分:1)
您需要保留所有内容
int indexes[PTHREAD_COUNT];
for (i=0;i<100;i++) {
indexes[i] = i;
pthread_create(&thread[i], &attr, test, &indexes[i]);
}
答案 2 :(得分:0)
i
与主代码中的j
地址相同,并且在线程中睡眠时间为30毫秒。因此所有线程都有时间运行,直到第一个互斥锁调用,然后它们都停止(稍微超过)30ms,然后打印它们已经完成。当然,主循环中的i
现在为99,因为您已完成pthread_join循环。
您需要有一个“j”值数组[假设您希望所有线程独立运行]。或者做点别的。这一切都取决于你实际想做什么。