我使用POSIX线程创建了两个线程数组。学生和教师都有两个线程函数。我的示例程序如下。我有一个小问题,我已在代码中注释掉了。我在main函数的最后编写了一个线程连接函数。是这样的,或者以这种方式写它有什么不对吗?
示例代码片段:
int main(void)
{
pthread_t thread[25];
int i;
int id1[25]; //for students
int id2[6]; //for teachers
for(i=0;i<25;i++)
{
id1[i]=i;
id2[i]=i;
pthread_create(&thread[i],NULL,student,(void*)&id1[i] );
if(i<6)
{
pthread_create(&thread[i],NULL,teacher,(void*)&id2[i]);
}
}
for (i=0;i<25;i++)
{
pthread_join(thread[i],NULL); //problem in this line
}
return 0;
}
答案 0 :(得分:5)
pthread_create(&thread[i],NULL,student,(void*)&id1[i] );
if(i<6)
{
pthread_create(&thread[i],NULL,teacher,(void*)&id2[i]);
}
对于i<6
,thread[i]
student
中的值被后来的pthread_create()
覆盖,导致6个线程泄露。 <{1}}即将返回时,6个可连接线程仍在运行。
答案 1 :(得分:3)
我不认为你的问题最终是在加入线程时,但是在线程启动时就开始了。
首先,id2[i]=i
可能会给出一个段错误,除非该语句移动到i<6
的检查中。
接下来,覆盖在if语句之前已经创建的if语句中的相同&thread[i]
意味着您已经失去了对6个学生线程的控制权,那么最终不会加入那些。
答案 2 :(得分:1)
避免由于id2 [i] = i导致的未定义行为问题的方法之一以及在没有加入的情况下留下的线程数的问题可以通过为教师/学生提供单独的数组以及适当的更改创建/加入程序。
您可以为学生和教师提供单独的pthread_t数组,如下所示:
pthread_t thread_teacher[6];
pthread_t thread_student[25];
因此,覆盖学生和教师的创建和加入程序的更新可以如下:
for(i=0;i<25;i++)
{
id1[i]=i;
pthread_create(&thread_student[i],NULL,student,(void*)&id1[i] );
if(i<6)
{
id2[i]=i;
pthread_create(&thread_teacher[i],NULL,teacher,(void*)&id2[i]);
}
}
for (i=0;i<25;i++)
{
pthread_join(thread_student[i],NULL);
if(i<6)
pthread_join(thread_teacher[i],NULL);
}