当前位置:  技术问答>unix/linux知识 iis7站长之家

关于Linux程序设计中多线程信号量的一个疑问

    来源: 互联网  发布时间:2016-11-02

    本文导语:  本人新手,目前在看Neil Matthew和Richard Stones的《linux程序设计》一书。在看第十二章12.5部分利用信号量对线程同步部分,对下面一个程序有点小小的疑问,先贴程序: #include  #include  #include  #include  #include  #include...

本人新手,目前在看Neil Matthew和Richard Stones的《linux程序设计》一书。在看第十二章12.5部分利用信号量对线程同步部分,对下面一个程序有点小小的疑问,先贴程序:

#include 
#include 
#include 
#include 
#include 
#include 

void * thread_function(void *arg);
sem_t bin_sem;

#define WORK_SIZE 1024
char work_area[WORK_SIZE];

int main(){
    int res;
    pthread_t a_thread;
    void *thread_result;

    res=sem_init(&bin_sem,0,0);
    if(res!=0){
        perror("Semaphore initialization failed");
        exit(EXIT_FAILURE);
    }

    res=pthread_create(&a_thread,NULL,thread_function,NULL);
    if(res!=0){
        perror("Thread creation failed");
        exit(EXIT_FAILURE);
    }

    printf("Input some text,Enter 'end' to finishn");
    while(strncmp("end",work_area,3)!=0){
        fgets(work_area,WORK_SIZE,stdin);
        sem_post(&bin_sem);
    }

    printf("nWaiting for thread to finish...n");
    res=pthread_join(a_thread,&thread_result);
    if(res!=0){
        perror("Thread join failed");
        exit(EXIT_FAILURE);
    }
    printf("Thread joinedn");
    sem_destroy(&bin_sem);
    printf("main thread is overn");
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg){
    sem_wait(&bin_sem);
    while(strncmp("end",work_area,3)!=0){
        printf("You input %d charactersn",strlen(work_area)-1);
        sem_wait(&bin_sem);
    }
    printf("child thread is overn");
    pthread_exit(NULL);
}

本人做了一点小小的修改,在主线程和子线程结束前加了一个打印语句。程序的意思是这样的:主线程负责从stdin中接受输入,并复制到工作区,释放信号量(+1),然后从进程接受到信号量后统计输入字符数。程序一输入"end"结束。
我的疑问是输入"end"后,主线程即结束循环,不会再释放信号量(sem_post(&bin_sem);此时的从线程应该还停留在sem_wait(&bin_sem),直到主线程结束而随之销毁。但是通过实验我们可以看出子线程在主线程结束之前执行了printf("child thread is overn");请问是什么原因使从进程没有停留在sem_wait(&bin_sem)这条语句往下执行了,谢谢!

|
是不是res=pthread_join(a_thread,&thread_result);
会向子线程发送什么信号量啊?
----------------------------

pthread_join()不会向子线程发送信号量的,它只是等待子线程的结束。
如果不调用pthread_join(),那么主线程结束后,整个进程就结束了,子线程也香消玉陨了

    
 
 

您可能感兴趣的文章:

  • 在linux下怎么使用信号量?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 关于Linux下的信号量
  • 请问下,在嵌入式linux驱动里面可不可以用信号量?
  • linux中信号量实现原理
  • linux下信号量的释放的问题
  • linux服务器中,php页面中信号量锁住的问题,在线等
  • 在linux下有没有系统的命令可以看到某个信号量被哪个进程锁定?
  • linux posix信号量使用疑问
  • 靠,Linux提供给应用开发的信号量机制也太复杂了吧
  • 求 思路 信号量控制函数中的线程sleep 100微秒。(linux)
  • 一个关于linux的信号量集的问题
  • linux设备驱动中的信号量机制
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • Linux内核信号量和定时器问题请教:
  • linux 下使用信号量编程的问题·~~~~谁能帮帮我啊????
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在linux RH73下为什么单进程只能开1021个线程线程.
  • Linux下如何让主线程挂起一个指定的时间段而子线程继续运行?谢谢
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 最进想学习LINUX程序设计,想了解一下在LINUX下的C++程序开发工具有哪些?有快速做界面的那种吗?
  • 求gnu/linux编程指南,linux程序设计二本书
  • 学了linux程序设计后能不能编写出应用程序
  • 对于一个程序员来说,学习linux程序设计和unix编程到底有什么好处
  • 初学linux程序设计,有个程序找不到思路,跪求大神指点!
  • 初学linux,请问《Unix环境高级编程》和《Linux程序设计》哪本书比较适合先看?
  • 求:Linux 程序设计(原书第2版) ( Beginning Linux Programming,2nd Edition ) 电子版
  • 请推荐几本经典的linux下程序设计的书籍~
  • trap '' INT..为什么ctrl+c,不会终止脚本程序呢。这是Linux程序设计里面的例子。
  • 一个老程序员的观点:Linux程序/内核设计是一门技术,Windows下的可扩展、可复用架构设计是一门艺术!
  • 初学linux程序设计的问题
  • 《linux程序设计》中的一个问题
  • 怎样学习Linux环境C程序设计
  • linux中大量的全局变量怎么体现结构化的程序设计?
  • 请问谁有<linux 程序设计(第二版)>的中文版
  • 去深圳书城竟然买不带《linux程序设计》
  • 大家觉得LINUX程序设计这本书怎么样?看过的进来说说
  • unix环境高级编程和linux程序设计这两本书有啥区别呢?
  • 关于linux下的程序设计问题
  • 阿凡提学linux程序设计100问(1)
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3