C:printf()与flockfile()的线程不安全



我需要在屏幕上打印一些消息,我的程序是多进程和多线程的。我使用了flockfile()flock()和互斥,但有些消息是重叠的。我还做了一个基本的测试程序,结果是一样的。为什么我不能同步输出?

void my_printf() {
    int i;
    for (i=0; i<20000; ++i) {
        flockfile(stdout);
        printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZn");
        fflush(stdout);
        funlockfile(stdout);
    }
}

int main()
{
    fork();
    fork();
    fork();
    my_printf();
    exit(0);
}

编辑

@约阿希姆·皮莱堡我试过使用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("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZn");
        sem_post(str->t);
        fflush(stdout);
    }
}

int main()
{
    struct my_struct *my = create_shared_memory();
    fork();
    fork();
    my_printf(my);
    exit(0);
}

flockfile函数用于锁定其他线程,而不是进程。如果您想要进程间锁定,请查看例如POSIX信号量,尤其是命名信号量。

最新更新