gpt4 book ai didi

c - 同时从多个线程调用 write() 是否安全?

转载 作者:太空宇宙 更新时间:2023-11-04 00:23:49 27 4
gpt4 key购买 nike

假设我已经打开 dev/poll 作为 mDevPoll,我这样调用代码是否安全

struct pollfd tmp_pfd;
tmp_pfd.fd = fd;
tmp_pfd.events = POLLIN;

// Write pollfd to /dev/poll
write(mDevPoll, &tmp_pfd, sizeof(struct pollfd));

...同时来自多个线程,还是我需要在 mDevPoll 周围添加自己的同步原语?

最佳答案

Solaris 10 声称是 POSIX 兼容的。 write() 函数不在 the handful of system interfaces that POSIX permits to be non-thread-safe 中, 因此我们可以得出结论,在 Solaris 10 上,从一般意义上讲,从两个或多个线程同时调用 write() 是安全的。

POSIX 还在 functions whose effects are atomic relative to each other 中指定了 write()当他们对常规文件或符号链接(symbolic link)进行操作时。具体来说,它说

If two threads each call one of these functions, each call shall either see all of the specified effects of the other call, or none of them.

如果您的写入是定向到一个常规文件,那么这足以得出您建议的多线程操作是安全的,因为它们不会相互干扰,并且一次调用中写入的数据不会与任何线程中不同调用所写的内容混合在一起。不幸的是,/dev/poll 不是常规文件,因此这并不直接适用于您。

您还应该知道 write() 通常不需要传输单个调用中指定的全部字节数。因此,对于一般用途,必须准备好通过使用循环在多个调用中传输所需的字节。 Solaris 可能提供超出 POSIX 表达的适用保证,可能特定于目标设备,但如果没有此类保证,可以想象您的一个线程执行部分写入,而下一个写入由另一个线程执行。这很可能不会产生您想要或期望的结果。

关于c - 同时从多个线程调用 write() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com