开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3173|回复: 6
收起左侧

[源码分享] 队列、信号量、多线程同步综合使用

[复制链接]

结帖率:63% (5/8)
发表于 2013-8-3 14:31:31 | 显示全部楼层 |阅读模式   江西省九江市
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <pthread.h>
  6. #include <semaphore.h>
  7. #include "queue.h"

  8. void *thread_function(void *arg);

  9. #define WORK_SIZE 1024
  10. #define THREAD_NUM 10

  11. //互斥量work_mutex 将time_to_exit和strQueue管理在其中
  12. pthread_mutex_t work_mutex;
  13. queue_t* strQueue;
  14. int time_to_exit = 0;

  15. //信号量的作用是不通过轮询让多线程阻塞或者取消阻塞
  16. sem_t bin_sem;

  17. int main()
  18. {
  19.         char *local_work_area;
  20.         int i, res;
  21.         int thread_id[THREAD_NUM];
  22.         pthread_t thread[THREAD_NUM];
  23.         void *thread_result;

  24.         strQueue = init_queue();
  25.         res = pthread_mutex_init(&work_mutex, NULL);
  26.         if (res != 0)
  27.         {
  28.                 perror("Mutex initialization failed");
  29.                 exit(EXIT_FAILURE);
  30.         }
  31.         res = sem_init(&bin_sem, 0, 0);
  32.         if (res != 0)
  33.         {
  34.                 perror("Semaphore initialization failed");
  35.                 exit(EXIT_FAILURE);
  36.         }
  37.         for (i = 0; i < THREAD_NUM; i++)
  38.         {
  39.                 thread_id[i] = i;
  40.                 res = pthread_create(&thread[i], NULL, thread_function, &thread_id[i]);
  41.                 if (res != 0)
  42.                 {
  43.                         perror("Thread creation failed");
  44.                         exit(EXIT_FAILURE);
  45.                 }
  46.         }

  47.         printf("Input some text. Enter 'end' to finish\n");
  48.         while (1)
  49.         {
  50.                 local_work_area = (char*) malloc(WORK_SIZE);
  51.                 printf(">");
  52.                 fgets(local_work_area, WORK_SIZE, stdin); //gets(local_work_area);
  53.                 if (strcmp(local_work_area, "end\n") == 0)
  54.                 {
  55.                         printf("program ready to exit.\n");
  56.                         pthread_mutex_lock(&work_mutex);
  57.                         time_to_exit = 1;
  58.                         pthread_mutex_unlock(&work_mutex);
  59.                         break;
  60.                 }
  61.                 else if (strcmp(local_work_area, "\n") == 0)
  62.                         free(local_work_area);
  63.                 else
  64.                 {
  65.                         //begin input queue
  66.                         pthread_mutex_lock(&work_mutex);
  67.                         //将字符串的地址 加入到队列中
  68.                         enqueue(strQueue, local_work_area);
  69.                         pthread_mutex_unlock(&work_mutex);

  70.                         //通知其他线程,有字符串加入到队列中了
  71.                         sem_post(&bin_sem);
  72.                 }
  73.         }

  74.         printf("\nWaiting for thread to finish...\n");
  75.         for (i = 0; i < THREAD_NUM; i++)
  76.         {
  77.                 sem_post(&bin_sem); //激活正在阻塞的线程
  78.         }

  79.         //上,下两段for语句,不能组合在一个for中。
  80.         //因为thread[i]完全有可能不把收到sem_post()的信号,就会一无限等待
  81.         for (i = 0; i < THREAD_NUM; i++)
  82.         {
  83.                 res = pthread_join(thread[i], &thread_result);
  84.                 if (res != 0)
  85.                 {
  86.                         perror("Thread join failed");
  87.                         exit(EXIT_FAILURE);
  88.                 }
  89.         }
  90.         pthread_mutex_destroy(&work_mutex);
  91.         sem_destroy(&bin_sem);
  92.         exit(EXIT_SUCCESS);
  93. }

  94. /**
  95. * src转换为大写到dst
  96. */
  97. void CopyAndUpper(char *dst, char *src)
  98. {
  99.         while (((*src) != '\n') && ((*src) != '\0'))
  100.         {
  101.                 *dst = toupper(*src);
  102.                 src++;
  103.                 dst++;
  104.         }
  105.         *dst = '\0';
  106. }

  107. void *thread_function(void *arg)
  108. {
  109.         char strlocal[WORK_SIZE], strtemp[WORK_SIZE];
  110.         int thread_id = *(int*) (arg);
  111.         char *p;
  112.         while (1)
  113.         {
  114.                 //排队
  115.                 sem_wait(&bin_sem);
  116.                 pthread_mutex_lock(&work_mutex);
  117.                 if (time_to_exit == 1)
  118.                 {
  119.                         pthread_mutex_unlock(&work_mutex);
  120.                         break;
  121.                 }
  122.                 //出队,获取到地址后,strcpy拷贝到strtemp
  123.                 dequeue(strQueue, &p);
  124.                 strcpy(strtemp, p);
  125.                 pthread_mutex_unlock(&work_mutex);        //互斥量时间越少越好

  126.                 CopyAndUpper(strlocal, strtemp);
  127.                 if (strlen(strlocal) > 3)
  128.                         sleep(strlen(strlocal));        //模拟长时间运算,每字符一秒
  129.                 printf("thread-%d: %s len=%d\n", thread_id, strlocal, strlen(strlocal));
  130.                 free(p);
  131.         }
  132.         pthread_exit(0);
  133. }
复制代码

签到天数: 7 天

发表于 2024-10-7 09:50:18 | 显示全部楼层   浙江省台州市
111111111111111111111111111111111111111111111
回复 支持 反对

使用道具 举报

发表于 2023-8-2 21:15:35 | 显示全部楼层   浙江省宁波市
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2014-9-8 22:40:54 | 显示全部楼层   浙江省杭州市
有e源码就好了
回复 支持 反对

使用道具 举报

结帖率:73% (8/11)

签到天数: 22 天

发表于 2013-11-24 22:05:34 | 显示全部楼层   广西壮族自治区梧州市
好高深啊  看不懂啊
回复 支持 反对

使用道具 举报

结帖率:57% (13/23)
发表于 2013-8-3 14:34:01 | 显示全部楼层   广东省惠州市
沙发终结者,

点评

不厚道啊!抢我名言不但,还抢我sf。。。   广东省梅州市  发表于 2013-8-3 14:45
回复 支持 0 反对 1

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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