在一个线程中读写文件描述符,在另一个线程中关闭?

问题描述 投票:0回答:1

假设我有一个文件描述符,它是由几个线程共享的。一个线程目前正在向它写或从它读,也让我们假设这个操作 "真的很慢"(例如它不是一个普通的磁盘文件,可能是嵌入式设备的UART终端)。

int ret = read(sharedFd, buffer, sizeof(buffer));

现在,又有一条线在关闭这个共享文件描述符。

int ret = close(sharedFd);

为了让它变得更复杂,让我们假设进行读写的线程 在翻译完这个共享文件描述符之后就被暂停了 sharedFd 索引到系统的文件结构中,但在它真正开始操作之前(它有底层对象的句柄,但还没有开始使用它)。我知道这是一个非常不好的做法,一般不是一个好的代码,等等,等等。但我更想知道下面的问题的答案。

是否有任何标准(POSIX, C, ...)--直接或间接地--说这样的用例是 "未定义的行为"?

我提出这个问题的原因不是因为我想写这样的代码,想知道它是否好,或者如何修复它 (我知道一般情况下是不好的,应该用mutex或semaphore这样的同步方式来改进。). 我之所以这么问,是因为我正在为微控制器编写一个RTOS,目前我正在实现IO层,此刻我想知道我的系统是否可以安全地忽略这样的问题(因此将 "未定义行为 "的每一个可能的结果--包括整个设备的瞬间崩溃--都归咎于用户的代码),或者也许我应该以某种方式在内部处理这个问题(例如通过引用计数,只有在最后一个使用它的调用返回后才实际关闭文件)?

c multithreading io posix file-descriptor
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.