我认为我的代码不会打印文本
哦,为什么来这里!\ n
但确实如此。
system()
是否有“错误”?因为,当我删除它时,代码按我的意愿运行,停止运行。
#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, 0);
pthread_create(&id0, 0, fun0, NULL);
pthread_create(&id1, 0, 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或内核2.6.18。
答案 0 :(得分:3)
system()
来电与此无关。我的通灵能力告诉我sem_wait
失败了错误代码而不是等待检查返回值。例如,我可以在Mac OS X上重现您的结果,因为在Mac OS X上,sem_init()
始终失败并显示ENOSYS
(“功能未实现”),这会导致调用sem_wait
然后以EBADF
(“错误的文件描述符”)失败。
如果你添加一些错误检查,你会看到出错的地方:
if(sem_init(&sp, 0, 0) < 0)
fprintf(stderr, "sem_init failed: %s\n", strerror(errno));
...
if(sem_wait(&sp) < 0)
fprintf(stderr, "sem_wait failed: %s\n", strerror(errno));
您还应该提高编译器的警告级别 - 如果您想捕获更多可能的问题,我绝对建议使用-Wall
和-Wextra -pedantic
。目前,您的代码未能返回fun0
和fun1
函数中的值,而-Wall
会警告您这些函数,因此会调用未定义的行为。这种错误可能不会在x86上引起任何明显的问题,但在其他体系结构上,例如IA64,uninitialized garbage can be deadly。
答案 1 :(得分:1)
你的代码问题是sem_wait(),来自sem_wait手册页,它说:
“sem_wait()递减(锁定)sem指向的信号量。如果信号量的值大于零,则递减继续,函数立即返回。如果信号量当前值为零,则调用块,直到可以执行递减(即,信号量值上升到零以上),或者信号处理程序中断调用。“
在你的代码中你用sp为0初始化,当sem_wait()递减时,它会阻塞并且永远不会返回,因为没有其他线程增加sp变量。