c - 调用 trylock() 后解锁互斥量

标签 c linux pthreads mutex

我有一个线程服务器,可以添加/附加/读取文件并将数据中继到客户端。

如果正在添加一个文件,则没有其他线程可以追加/读取它。如果正在追加文件,则没有线程可以追加/读取它。如果正在读取文件,则没有其他线程可以附加到它。但是,如果正在读取一个文件,则其他文件可以读取它。

目前我有一个互斥系统可以执行此操作,但它不允许多次读取。

为了解决这个问题,在读取方法中,我将更改:

pthread_mutex_lock(&(fm->mutex));//LOCK
//do some things`
...
pthread_mutex_unlock(&(fm->mutex));

pthread_mutex_trylock(&(fm->mutex));//TRYLOCK [NonBlocking, so the thread can continue the read]
//do some things`
...
pthread_mutex_unlock(&(fm->mutex));

问题

在所有其他 read() 完成之前,如何在不允许其他方法(实际上只是追加)开始写入文件的情况下解锁文件?

示例

例如,如果最初锁定文件的读取线程完成并解锁文件,并且仍有其他线程尝试读取文件,则追加线程有机会锁定文件并开始追加,而其他线程正在仍在阅读,这是一个禁忌。

想法

我想统计当前读取文件的线程数。当线程完成时,减少计数。如果计数为 0,表示没有线程仍在读取,则解锁文件。但是,我担心这不是线程安全的。如果这是一个可行的解决方案,我怎样才能使它线程安全?另一个但是,我相信只有原始线程才能成功解锁互斥量。

最佳答案

听起来您可能正在寻找 read-write lock ,这是由 pthreads 提供的。它允许两种锁定模式:共享/读取锁定模式,可以同时被多个线程锁定,以及独占/写入锁定模式,在所有其他线程(读取器和写入器)之前,锁定调用不会返回) 放弃了对锁的持有。

关于c - 调用 trylock() 后解锁互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006937/

相关文章:

c - 获取文本而不是 EOF

c - c 中的 isdigit 函数我的代码有什么问题?

c++ - 如何使用 Lua 从表中的表中获取值?

linux - 创建多个子进程时出现问题

在 C 中正确等待线程终止

c - 用文件的内容填充字符串数组

php - 如何使用 PHP 替换 PDF 文件中的内容?

linux - Bash-从日期开始获取星期

c - 抢占、pthread_spin_lock 和原子内置

未知原因的 C++ libpthread 程序段错误