免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3765 | 回复: 17
打印 上一主题 下一主题

[C++] 一个多线程的控制问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-02-02 20:28 |只看该作者 |倒序浏览
小弟最近初学pthread,现在有一个场景,
在一个4核CPU,每个核上启动2个线程,线程和核的映射有相应函数处理,
假设线程是A1A2B1B2C1C2D1D2,A1输出一个A,并且向一个缓冲区里写一个字母A,B1C1D1输出BCD,A2
从缓冲区内消耗一个字母A,并输出E,B2C2D2输出FGH字母,
逻辑是A1B1C1D1一起执行,容器满了换A2B2C2D2执行,空了再切换
单核上线程切换用条件变量会做,请问如何根据缓冲区是否为空,来控制多个线程的切换呢?求各位指导

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2016-02-03 10:01 |只看该作者
本帖最后由 cokeboL 于 2016-02-03 10:08 编辑

目测信号量比较合适,随便signal什么的都能搞啊

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
3 [报告]
发表于 2016-02-03 10:41 |只看该作者
以A1 A2为例
  1. #include <pthread.h>
  2. #include <semaphore.h>
  3. #include <sys/types.h>
  4. #include <stdio.h>
  5. #include <unistd.h>

  6. #define BUF_LEN_A 5

  7. sem_t sem_id_A1;
  8. sem_t sem_id_A2;
  9. int buf_len_A = 0;
  10. char buf_A[BUF_LEN_A] = {0};

  11. void* thread_A1(void *arg)
  12. {
  13.         while(1)
  14.         {
  15.                 //example
  16.                 printf("\n");
  17.                 for(int i=0; i < BUF_LEN_A; i++)
  18.                 {
  19.                         sleep(1);
  20.                         buf_A[buf_len_A] = 'A';
  21.                         printf("thread_A1 set %d: %c\n", i, buf_A[i]);
  22.                         buf_len_A++;
  23.                 }
  24.                
  25.                 if(BUF_LEN_A == buf_len_A)
  26.                 {
  27.                         buf_len_A--;
  28.                         sem_post(&sem_id_A2);
  29.                         sem_wait(&sem_id_A1);
  30.                 }
  31.         }
  32. }

  33. void* thread_A2(void *arg)
  34. {
  35.         while(1)
  36.         {
  37.                 sem_wait(&sem_id_A2);

  38.                 //example
  39.                 printf("\n");
  40.                 for(int i=buf_len_A; i >= 0; i--)
  41.                 {
  42.                         printf("thread_A2 get %d: %c\n", i, buf_A[i]);
  43.                         buf_len_A--;
  44.                         sleep(1);
  45.                 }

  46.                 if(buf_len_A < 0)
  47.                 {
  48.                         buf_len_A++;
  49.                         sem_post(&sem_id_A1);
  50.                 }
  51.         }
  52. }

  53. int main(int argc, char *argv[])
  54. {
  55.         pthread_t tid_A1, tid_A2;
  56.         sem_init(&sem_id_A1, 0, 0);
  57.         sem_init(&sem_id_A2, 0, 0);
  58.         pthread_create(&tid_A1,NULL,thread_A1, NULL);
  59.         pthread_create(&tid_A2,NULL,thread_A2, NULL);

  60.         getchar();

  61.         return 0;
  62. }

复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
4 [报告]
发表于 2016-02-03 14:27 |只看该作者
骚年, 我想你需要的不是多线程, 而是"协程".....

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2016-02-03 14:42 |只看该作者
回复 4# hanxin83


    一个循环里套两个循环就行,协程都不需要了。。但是不知道楼主具体需求是啥

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2016-02-03 16:23 |只看该作者
本帖最后由 lxyscls 于 2016-02-03 16:48 编辑

回复 1# protossYSZ


    挺奇怪的需求,只要buffer里面有数据,A2B2...这种就可以取数据,为什么非要等到buffer满?
    你这种模型,可以算是pipeline,无非是一级pipeline有多个线程,并且互为pipeline

    A1B1...
  1.     pthread_mutex_lock(mutex)
  2.     while (buf == FULL)
  3.         pthread_cond_wait(not_full_cond, mutex)

  4.     insert && ++i1

  5.     if (i1 == FULL) {
  6.         buf += i1
  7.         i1 = 0
  8.         pthread_cond_broadcast(full_cond)
  9.     }
  10.     pthread_mutex_unlock(mutex)
复制代码
A2B2...
  1.     pthread_mutex_lock(mutex)
  2.     while (buf != FULL)
  3.         pthread_cond_wait(full_cond, mutex)
  4.    
  5.     consume && ++i2

  6.     if (i2 == FULL) {
  7.         buf -=i2
  8.         i2 = 0
  9.         pthread_cond_broadcast(not_full_cond)
  10.     }
  11.     pthread_mutex_unlock(mutex)
复制代码

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2016-02-03 16:25 |只看该作者
本帖最后由 lxyscls 于 2016-02-03 16:27 编辑

回复 1# protossYSZ


   

论坛徽章:
0
8 [报告]
发表于 2016-02-03 20:51 |只看该作者
回复 3# cokeboL


    谢谢~我详细看一下,刚开始学

论坛徽章:
0
9 [报告]
发表于 2016-02-03 20:54 |只看该作者
回复 5# cokeboL


    我开始想用条件变量,但是没有看到过多个线程成一组用条件变量控制组内线程切换的例子,就奇怪是不是需要多个条件变量来控制

论坛徽章:
0
10 [报告]
发表于 2016-02-03 20:59 |只看该作者
回复 6# lxyscls


    请问如果4个核,那么需要4个锁和4个条件变量嘛,开始没想出来的地方是,线程A1A2根据缓冲区为空用条件变量切换,可是B1C1D1如何跟随A1A2进行切换
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP