据我所知,无需互斥或信号量即可调用线程安全函数。他们不能吗?
例如,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);
答案 0 :(得分:3)
在此上下文中,“ MT-Safe”仅表示您可以从多个线程中调用该函数,而不是线程之间存在任何同步。
例如,您有两个线程,其中一个正在做strcpy(s1, "foo")
,另一个正在做strcpy(s1, "bar")
(而s1
是线程之间共享的缓冲区),那么您就有了一个数据-race,因为两个线程都可能尝试同时写入目标s1
。