免费注册 查看新帖 |

Chinaunix

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

[Linux] 信号量同步两个线程的问题,求指导[已解决] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-08 16:18 |只看该作者 |倒序浏览
本帖最后由 crazyhadoop 于 2012-12-21 09:12 编辑

求教的问题描述:
两个线程,
想实现的步骤如下,read_thread线程工作16次后send_thread线程才工作,
但是调试结果显示只能执行一次read_thread,打印一次read_thread running程序就停止了,
请教各位,程序是哪里问题?

【fix】 两个线程之间同步,一个信号量就可以了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <pthread.h>
  6. #include <semaphore.h>
  7. sem_t rd_sem,net_sem;
  8. int count=0;

  9. void* read_thread(void* arg)
  10. {
  11.    int rd_ret=0;
  12.    int i=0;
  13.         while(1)
  14.         {
  15.        
  16.          count+=1;
  17.           printf("read_thead running!\n");
  18.           if(count==16)
  19.                 {
  20.                     count=0;
  21.                    sem_post(&net_sem);
  22.                 }

  23.         sleep(2);       
  24.         }

  25.        
  26. }

  27. void* send_thread(void* arg)
  28. {
  29.       while(1)
  30.         {
  31.            sem_wait(&net_sem);
  32.            printf("Send dates to PC\n");
  33.         }
  34. }

  35. int main()
  36. {
  37.         int ret=0;
  38.         pthread_t  pid1,pid2;
  39.         [u]ret=sem_init(&rd_sem,0,1);//保证先启动读线程   
  40. [/u]          ret=sem_init(&net_sem,0,0);
  41.              if(ret!=0)
  42.                 {
  43.                     perror("sem_init");
  44.                 }
  45.              ret = pthread_create(&pid1, NULL,read_thread, NULL);
  46.                 if(ret!=0)
  47.                 {
  48.                     perror("read_thread");
  49.                 }
  50.               ret = pthread_create(&pid2, NULL,send_thread, NULL);
  51.                 if(ret!=0)
  52.                 {
  53.                     perror("send_thread");
  54.                 }
  55.   pthread_join(pid2,NULL);
  56.         return 0;

  57. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-12-08 17:56 |只看该作者
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <semaphore.h>
sem_t rd_sem,net_sem;
int count=0;

void* read_thread(void* arg)
{
   sem_wait(&rd_sem);
   int rd_ret=0;
   int i=0;
        while(1)
        {
          //sem_wait(&rd_sem);
         count+=1;
          printf("read_thead running!\n");
          if(count==16)
                {
                    count=0;
                   sem_post(&net_sem);
                }

        sleep(2);        
        }

        
}

void* send_thread(void* arg)
{
      while(1)
        {
           sem_wait(&net_sem);
           printf("Send dates to PC\n");
           sem_post(&rd_sem);
        }
}

int main()
{
        int ret=0;
        pthread_t  pid1,pid2;
         ret=sem_init(&rd_sem,0,1);//保证先启动读线程
          ret=sem_init(&net_sem,0,0);
             if(ret!=0)
                {
                    perror("sem_init");
                }
             ret = pthread_create(&pid1, NULL,read_thread, NULL);
                if(ret!=0)
                {
                    perror("read_thread");
                }
              ret = pthread_create(&pid2, NULL,send_thread, NULL);
                if(ret!=0)
                {
                    perror("send_thread");
                }
  pthread_join(pid2,NULL);
        return 0;

}

论坛徽章:
0
3 [报告]
发表于 2012-12-12 09:33 |只看该作者
你这帖子貌似在csdn发过啊,我给你回帖了,你去csdn看一下就可以了!

论坛徽章:
0
4 [报告]
发表于 2012-12-14 09:08 |只看该作者
回复 3# core1011
是的 谢谢了 已经解决了


   

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
5 [报告]
发表于 2012-12-18 17:14 |只看该作者
回复 4# fightingM


    把解决方法贴到你这个问题下多好~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP