微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

system是否在像sem_post里面调用?

我想我的代码不会打印文本

哦,为什么来这里! n

但它确实。

system()有什么问题吗? 因为,当我删除它时,代码就像我想的那样运行,停下来。

如何使用pthreads障碍?

如何在Windows上使用C ++将包含多个分区的映像写入USB闪存驱动器

在C ++的windows应用程序中构build一个类似于数据网格的excel

C ++ Windows链接子系统问题

使用事件日志启用多个源将条目写入同一个日志

#include <pthread.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> pthread_t id0,id1; sem_t sp; void *fun0(void *) { // When erasing the following line "system("");",// it block up,and doesn't print "oh why come here!n". // But with it,it print the text! system(""); return NULL; } void *fun1(void *) { sem_wait(&sp); fprintf(stderr,"oh why come here!n"); return NULL; } int main() { sem_init(&sp,0); pthread_create(&id0,fun0,NULL); pthread_create(&id1,fun1,NULL); void *stat0,*stat1; pthread_join(id0,&stat0); pthread_join(id1,&stat1); return 0; }

编译器:gcc 4.1.2 Linux内核:2.6.18

我编译它与gcc 4.6.3,内核3.2.0,它也运行,我也想。 所以我认为这是因为gcc 4.1.2或者kernel 2.6.18。

C#创build目录并设置权限

为什么connect()会给EADDRNOTAVAIL?

如果有几个以太网适配器,您将如何通过MAC地址亲自识别工作站?

是否有可能从XML文件中dynamic构build函数声明?

我的C ++应用程序如何调用驱动程序的接口?

你的代码的问题是sem_wait(),从sem_wait手册页,它说:

“sem_wait()递减(锁定)由sem指向的信号量,如果信号量的值大于零,则递减继续,函数立即返回;如果信号量当前具有零值,则阻塞直到要么执行递减(即,信号值上升到零以上),要么信号处理程序中断呼叫。

在你的代码中,你用sp初始化为0,当sem_wait()递减时,它会阻塞并永远不会返回,因为没有其他线程增加sp变量。

system()调用与它无关。 我的心理能力告诉我, sem_wait失败,错误代码,而不是等待检查返回值。 例如,我可以在Mac OS X上重现您的结果,因为在Mac OS X上, sem_init()总是失败, ENOSYS (“函数未实现”)导致对sem_wait的调用,然后由于EBADF失败(“Bad file descriptor “)。

如果你添加一些错误检查,你会看到事情发生错误的地方:

if(sem_init(&sp,0) < 0) fprintf(stderr,"sem_init Failed: %sn",strerror(errno)); ... if(sem_wait(&sp) < 0) fprintf(stderr,"sem_wait Failed: %sn",strerror(errno));

你也应该提高编译器的警告级别 – 我绝对推荐使用-Wall和-Wextra -pedantic如果你想捕捉更多的可能的问题。 目前,您的代码通过未能从您的fun0和fun1函数返回值来调用未定义的行为 ,这将会警告您。 这种错误在x86上可能不会造成任何明显的问题,但在IA64等其他体系结构中, 未初始化的垃圾可能是致命的 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐