【发布时间】:2015-11-11 16:04:58
【问题描述】:
我需要在屏幕上打印一些消息,我的程序是多进程和多线程的。我使用了flockfile()、flock() 和互斥锁,但有些消息是重叠的。我也做了一个基本的测试程序,结果是一样的。为什么我不能同步输出?
void my_printf() {
int i;
for (i=0; i<20000; ++i) {
flockfile(stdout);
printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
fflush(stdout);
funlockfile(stdout);
}
}
int main()
{
fork();
fork();
fork();
my_printf();
exit(0);
}
编辑
@Joachim Pileborg
我曾尝试使用sem_t 信号量,但结果相同...字符串重叠。
struct my_struct {
sem_t *t;
};
struct my_struct *create_shared_memory(void)
{
struct my_struct *str;
key_t key;
int fd;
key = ftok("/", '5');
fd = shmget(key, sizeof(struct my_struct), IPC_CREAT|0666);
str = shmat(fd, NULL, 0);
str->t = sem_open("/my_sem", O_CREAT|O_EXCL, 0644, 1);
return str;
}
void my_printf(struct my_struct *str){
int i;
for (i=0; i<20000; ++i) {
sem_wait(str->t);
printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
sem_post(str->t);
fflush(stdout);
}
}
int main()
{
struct my_struct *my = create_shared_memory();
fork();
fork();
my_printf(my);
exit(0);
}
【问题讨论】:
-
你应该先
fflushsem_post。 -
@Schwartz 我也试过了,但结果一样
-
您似乎试图区分命名信号量和未命名信号量。
-
我正在开发 xCode,并且不推荐使用未命名信号量的 'sem_init()'。我只是尝试了命名的,但我有相同的结果。我知道没有必要为命名的 sem 创建共享内存,但不管有没有它,结果都是一样的。我只想知道为什么
标签: c multithreading thread-safety printf posix