我有一个线程服务器,可以添加/附加/读取文件并将数据中继到客户端。
如果正在添加一个文件,则没有其他线程可以追加/读取它。如果正在追加文件,则没有线程可以追加/读取它。如果正在读取文件,则没有其他线程可以附加到它。但是,如果正在读取一个文件,则其他文件可以读取它。
目前我有一个互斥系统可以执行此操作,但它不允许多次读取。
为了解决这个问题,在读取方法中,我将更改:
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/