C

时间:2019-05-15 13:00:04

标签: c multithreading unix thread-safety

据我所知,无需互斥或信号量即可调用线程安全函数。他们不能吗?

例如,strcpy()strdup()是一种线程安全功能。

但是当我阅读手册页时,我看到了以下内容,并且不明白加粗示例的说法。

  

成为MT-Safe并不意味着功能是原子的,也不意味着它是原子的                 使用任何内存同步机制POSIX                 向用户公开。甚至有可能致电MT-Safe                 依次使用功能不会产生MT-Safe组合。                 例如,有一个线程调用两个MT安全功能                 紧接着另一个不保证行为等同                 原子执行两个功能的组合,因为                 其他线程中的并发调用可能会干扰                 破坏性的方式。

线程功能中的以下用法是否错误?如果是,那有什么错呢?如果不是,那么加粗的那句话的意思是什么?

char *s1 = calloc(14, 1);
char *s2 = calloc(6, 1);
char *s3 = strdup("soner");
char *s4 = strdup("stackoverflow");
strcpy(s2, s3);
strcpy(s1, s4);
s1[13] = s2[5] = 0;

mutex_lock(&mtx);
printf("%s %s", s1, s2);
fflush(stdout);
mutex_unlock(&mtx);

free(s1);
free(s2);
free(s3);
free(s4);

1 个答案:

答案 0 :(得分:3)

在此上下文中,“ MT-Safe”仅表示您可以从多个线程中调用该函数,而不是线程之间存在任何同步。

例如,您有两个线程,其中一个正在做strcpy(s1, "foo"),另一个正在做strcpy(s1, "bar")(而s1是线程之间共享的缓冲区),那么您就有了一个数据-race,因为两个线程都可能尝试同时写入目标s1