VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 769|回复: 7

linux多线程编程

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-11 11:30:01 | 显示全部楼层 |阅读模式
一个如下程序
pthread_t thread[5];
pthread_mutex_t mut;
pthreat_cond_t cond

void Creat_Thread(char* p)
{
pthread_create(&thread[n], NULL, thread1, (void *)p);
}

void *thread1(void* p)
{
  .....
  while(1)
{
pthread_mutex_lock(&mut);
pthread_cond_wait(&cond,&mut);
..........处理函数1;
处理函数2;
处理函数3;
处理函数4;
pthread_mutex_unlock(&mut);
}
pthread_exit(NULL);
}


int main()
{
  初始化互斥锁和条件变量;
。。。。
for(i=0;i<5;i++)
     Creat_Thread(p[i]);
do
{                  
  pthread_cancel(thread[4]);                     
  pthread_cond_signal(&cond);                //发送信号
}while(1);  
thread_wait();
return 0;
}
程序编译通过,现在问题是多线程程序运行的时候,在建立线程的时候(即for循环创建线程的时候)运行正确(所有处理函数运行正确),然而在接下来使用互斥和条件变量运行的时候所有线程都运行到处理函数3,处理函数4就没有运行;不知道是什么原因;
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-6-5 11:15:01 | 显示全部楼层
看看程序的逻辑过程······
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-6-5 12:30:02 | 显示全部楼层
void Creat_Thread(char* p)
{
pthread_create(&thread[n], NULL, thread1, (void *)p);
}

n哪來的?少了个參數吧?
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-6-8 01:30:01 | 显示全部楼层
程序逻辑是顺序执行的,
是Creat_Thread(char* p ,int n)
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-6-9 21:15:01 | 显示全部楼层
多print點信息吧
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-6-14 12:30:01 | 显示全部楼层
哪个线程来发送pthread_cond_signal?
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-6-15 15:30:01 | 显示全部楼层
当pthread[4]被cancel的时候,线程可能没有释放互斥锁,
因为pthread_cond_signal是一个cancel点,线程可能会在这里结束了
回复

使用道具 举报

0

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-7-5 11:15:01 | 显示全部楼层
另外,在调用pthread_cond_signal的之前,要加上互斥锁,不然的话
可能会因为pthread_cond_wait在测试条件比较内存的时候,失去保护
而次序混乱
在调用pthread_cond_signal之后,解锁
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表