【发布时间】:2019-10-02 15:17:08
【问题描述】:
据我所知,可以调用线程安全函数而不需要互斥或信号量。他们不能吗?
例如,strcpy() 或 strdup() 是一种线程安全函数。
但是当我阅读手册页时,我看到以下内容并且不理解该说法以及粗体示例。
MT-Safe 并不意味着函数是原子的,也不意味着它是原子的 使用任何内存同步机制 POSIX 暴露给用户。甚至可以调用 MT-Safe 按顺序执行的功能不会产生 MT-Safe 组合。 例如,让一个线程调用两个 MT-Safe 函数之一 紧随其后不保证行为等同 原子执行这两个函数的组合,因为 其他线程中的并发调用可能会干扰 破坏性的方式。
线程函数中的以下用法是否错误?如果是,有哪些错误点?如果不是,加粗的那句话是什么意思?
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);
【问题讨论】:
-
只是说使用线程安全函数来实现你的算法并不能使你的算法线程安全。
-
Re,“strcpy()...有点线程安全。”不,
strcpy()和strdup()不是线程安全,它们是线程不可知。这些函数访问的唯一内存位置是它们自己的局部变量,以及程序提供指针的位置。如果您的线程不提供指向 shared 缓冲区的指针,那么在调用strcpy()或strdup()时,将不需要线程安全,因为不会发生冲突。另一方面,如果您的线程确实提供了指向共享数据的指针,那么确保安全是您的责任。 -
我很想听听“有点线程安全”的定义,它和“有点怀孕”一样吗?
标签: c multithreading unix thread-safety