【问题标题】:C : printf() not thread safe with flockfile()C:printf() 与flockfile() 不是线程安全的
【发布时间】: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


【解决方案1】:

flockfile 函数用于锁定其他线程,而不是进程。如果您想要进程间锁定,请查看例如POSIX semaphores,尤其是那些被命名的。

【讨论】:

  • 所以,我必须使用pthread_mutex_t??编辑:对不起,我现在已经阅读了链接!是否有另一种方法可以锁定进程和线程的标准输出?
  • @Simon 如果你锁定进程的访问权限,那也会锁定线程的访问权限。
  • @JoachimPileborg 这不是真的。例如,flock 锁如果您尝试使用它们在线程之间进行锁定,将会做出可怕的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多