关于linux下的多线程使用sem信号量的运行问题

关于linux下的多线程使用sem信号量的运行问题,第1张

不是信号量的问题

printf函数,是先写到输出缓冲,遇到\n时,或者缓冲区满时,或者有强制输出(fflush)时,才会将缓冲区里的内容输出到屏幕上(标准输出设备:stdout)。你的代码里面并没有以上3个触发条件的任意一种,所以printf的内存没有实际输出到屏幕上。

你只要在每个printf函数后面加上fflush(stdout)就可以了。

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,

消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

你编译的时候有加多线程连接选项吗? 要加上 -lpthread 或者 -pthread (尽量选后者)

例如 gcc -pthread -o test main.cpp

另外你的线程创建的不对,函数指针不能强转类型(这里也不用转)

pthread_create(&producter_t,NULL,(void*)producter_f,NULL)

pthread_create(&consumer_t,NULL,(void*)consumer_f,NULL)

应该是

pthread_create(&producter_t,NULL,producter_f,NULL)

pthread_create(&consumer_t,NULL,consumer_f,NULL)


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/337419.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存