C中的螺纹加工错误?
我编译了这段代码,创建它的第99个线程不断创建多个编号为99的线程。相反,如果我插入1-10或更小的值,那么结果是非常正常的 这是代码C中的螺纹加工错误?,c,multithreading,C,Multithreading,我编译了这段代码,创建它的第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=*((i
#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;
}
为什么会发生这种情况?每个线程都会向主线程中的相同堆栈位置(
j
)传递相同的指针。在没有进一步同步的情况下,在打印其值之前,每个线程将被调度并运行和访问j
的时间未定义
有很多方法可以从每个线程打印出一个唯一的数字,包括
注意,选项3和4涉及线程的序列化启动。如果你经常这样做,那么运行多个线程就没有什么意义了 你需要保留所有的资料
int indexes[PTHREAD_COUNT];
for (i=0;i<100;i++) {
indexes[i] = i;
pthread_create(&thread[i], &attr, test, &indexes[i]);
}
int索引[PTHREAD_COUNT];
对于(i=0;ii
是主代码中与j
相同的地址,您在线程中睡眠30毫秒。因此,所有线程都有时间运行,直到第一次互斥调用,然后它们都停止(稍多)当然,主循环中的i
现在是99,因为pthread\u join循环已经完成
您需要有一个“j”值数组[假设您希望所有线程独立运行]。或者执行其他操作。这取决于您实际想要执行的操作。您正在传递与指向数据a的指针相同的内存位置(&j)
当线程启动时,它们会打印出刚刚分配给j的值,看起来很正常
但是,只有一个人得到了锁并进入了睡眠,所有其他人都因此被封锁。当噩梦结束时,记忆位置“a”,当然,有一个int值99。实际上……他只有一个int值j@BrianRoach同意。这就是我想说的。如果你让我知道我的答案中哪一部分引起了混乱,我会改写它。我想这主要是我的阅读理解:)虽然我不知道这将如何工作,除非你运行一个又一个线程,这。。。不会有用的。我建议使用一个数组来保存“id”,或者做一些简单的事情,只需将值赋给j,而不是将其作为一个数组进行解引用pointer@BillSkiadas我更新了我的答案,提到了在每个线程中获得唯一编号的一些方法。选项1是最快的方法。我并不想粗鲁,但如果你自己尝试,而不是让所有的代码都为你编写,你会学到更多。考虑到目前为止的注意事项,它应该很容易实现;在循环中。非常感谢!:)
int indexes[PTHREAD_COUNT];
for (i=0;i<100;i++) {
indexes[i] = i;
pthread_create(&thread[i], &attr, test, &indexes[i]);
}