我想我的代码不会打印文本
哦,为什么来这里! 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 举报,一经查实,本站将立刻删除。