程序卡在pthread_join()

lisong871121 2009-11-05 02:15:10
我有一个主线程通过命令来创建和关闭多个子线程,但是不会超过32个,所以系统资源是肯定够得!具体步骤是这样

收到创建线程的命令,创建线程,线程时不断循环执行任务的,每次循环前检查标记flag[n](flag[n]为整形数组,用来标记每个子线程是否需要结束)是否为1,如果不为1则自己结束。

收到关闭线程的命令,通过将标记flag[n]置为0,然后调用pthread_join()来等待该线程结束,知道该线程结束后在执行新的命令。运行一段时间后程序就卡在pthread_join()这里了。谁知道怎么回事。
...全文
2096 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
muziaimugua 2012-09-29
  • 打赏
  • 举报
回复
我也遇到相同的问题,楼主是否有时间交流一下,qq:741376209
lisong871121 2009-11-06
  • 打赏
  • 举报
回复
cmd函数不会重入的哦。。。。
lvyinghong 2009-11-06
  • 打赏
  • 举报
回复
你的cmd 函数不回重入的吧?
不过个人觉得以毫秒级别,不停到创建和退出线程总是不合理的吧。
lisong871121 2009-11-06
  • 打赏
  • 举报
回复
我用了标记啊,通过将标记置为0,让线程号为n的现成自己结束。接着主线程用pthread_join应该能得到返回在对呢
lisong871121 2009-11-06
  • 打赏
  • 举报
回复
我改了下,不传地址。直接传值,写成pthread_create(........, (void*)n); 然后线程函数写成
handl(int n)就解决问题了。难得11楼看得这么仔细分全给了
lisong871121 2009-11-06
  • 打赏
  • 举报
回复
感谢楼上,我也刚找出来这个问题!刚准备结贴发现了你的答案。非常感谢
lvyinghong 2009-11-06
  • 打赏
  • 举报
回复
看出来了,你那个代码应该不会,会不会是传进来的
void *handl( int *n) 的n的问题, 因为你不同线程的 n都是同一个buffer里面的,
你在 handl 的开头打印一下 n指向的地址,看看是不是不同线程用到都是同一个地址的数据。

如果是这样,就有可能导致子线程运行到 int m = *n 之前,主线程又已经修改了 n中到数据,m得到的不是对应到值,
dongjiawei316 2009-11-05
  • 打赏
  • 举报
回复
pthread_join并不能结束某一个线程,而是等待一个线程的结束。而你的线程并没结束,所以他一直等待下去,
就阻塞住了

你要想结束一个线程,该用pthread_cancel
lisong871121 2009-11-05
  • 打赏
  • 举报
回复
谢谢大家,有点想法了,我在仔细看看
HULIHONG 2009-11-05
  • 打赏
  • 举报
回复
可以用条件变量和pthread_cancel试试
pottichu 2009-11-05
  • 打赏
  • 举报
回复
你的线程里是否会有阻塞调用?
如果有 现 pthread_cancel 一下。

另外你会不会 join 到不存在的线程 id ?
zkuang82 2009-11-05
  • 打赏
  • 举报
回复
你看那看有没有同一个thread被多次join的情况。如果有,行为是不确定的。
lisong871121 2009-11-05
  • 打赏
  • 举报
回复
程序太多,我大概写下伪代码吧
int flag[32]; //全局变量
pthread_t thread_id[32]; //全局变量

int main()
{
............
char* str[];
char *recv;
while(1)
{
recv(..., recv, ......);//根据buf来决定创建或者关闭子线程
//接收到的信息可能包含多条命令,将这些命令分割开并且存储到
//字符串数组str[]中

cmd(str); //调用命令处理函数
}

}

void cmd( char * str[])
{
int i =0;
while(str[i] != NULL)//分处理每个命令
{
buf = str[i]
if(buf == 创建线程) //buf里有个号码,n
{
flag[n] = 1;
pthread_create(&thread_id[n],.........., (void*)handl, n)
}
else if(buf == 关闭线程)
{
flag[n] = 0;
pthread_join(thread_in[n], NULL);
}
i++;
}
}


void *handl( int *n)
{
int m = *n
while(flag[m])
{
.......
}
pthread_exit(NULL);
}

如果我每次发送的命令格式为 《创建5个线程 关闭5个线程 创建5个线程》循环发送这样的命令,如果速度很快,比如1ms发一次就会出现程序卡在pthread_join()那个地方,发送慢点程序正常,谁能解释下么
zkuang82 2009-11-05
  • 打赏
  • 举报
回复
似乎需要贴一下程序吧,就这样说看不出问题。

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧