Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用trylock()后解锁互斥锁_C_Linux_Pthreads_Mutex - Fatal编程技术网

调用trylock()后解锁互斥锁

调用trylock()后解锁互斥锁,c,linux,pthreads,mutex,C,Linux,Pthreads,Mutex,我有一个线程服务器,可以添加/附加/读取文件,并将数据中继到客户端 如果正在添加文件,则其他线程无法追加/读取该文件。如果要追加文件,则没有线程可以追加/读取该文件。如果正在读取文件,则没有其他线程可以附加到该文件。但是,如果正在读取一个文件,其他文件可以读取它 目前我有一个互斥系统可以做到这一点,除了它不允许多次读取 要解决此问题,在read方法中,我将更改: pthread_mutex_lock(&(fm->mutex));//LOCK //do some things` ..

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

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

目前我有一个互斥系统可以做到这一点,除了它不允许多次读取

要解决此问题,在read方法中,我将更改:

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

问题

在其他所有read()都完成之前,如何解锁该文件而不允许其他方法(仅append really)开始写入该文件

示例

例如,如果最初锁定文件的读取线程完成并解锁该文件,并且还有其他线程尝试读取该文件,则追加线程有机会锁定该文件并在其他线程仍在读取时开始追加,这是不允许的

创意


我想记录当前读取文件的线程数。当线程结束时,减少计数。如果计数为0,表示没有线程仍在读取,请解锁该文件。但是,我担心这不会是线程安全的。如果这是一个可行的解决方案,我如何使其线程安全?另一个问题是,我相信只有原始线程才能成功解锁互斥锁。

您可以使用信号量而不是互斥锁(请参阅区别)。信号量为您执行线程安全的同步计数


如果将同时读取访问的数量限制为(足够大的)N,并要求将信号量增加该数量以进行写入访问,则可以不使用额外的互斥锁来锁定文件以进行写入。这样,只有当读卡器数量为零时,您才能获得写访问权限,并且所有其他读卡器都将被锁定,直到您的写入程序完成。

听起来您可能正在寻找一个由pthreads提供的。它允许两种锁定模式:一种是共享/读锁定模式,可由多个线程同时锁定;另一种是独占/写锁定模式,在这种模式下,锁定调用将不会返回,直到所有其他线程(读写器)放弃对锁的控制。

注意,POSIX的文档说明:

如果成功,pthread_mutex_lock()、pthread_mutex_trylock()和pthread_mutex_unlock()函数应返回零;否则,应返回错误号以指示错误

因为没有显示测试返回值的代码,所以不知道锁操作(尤其是)是否成功

另外,既然您想要读/写锁,为什么不使用一个:


有四个
pthread\u rwlockattr_*()
函数,总共有9个
pthread\u rwlock_*()
函数;我只列出了该系列中最重要的函数。

听起来您可能在寻找读写锁,它由pthreads提供:一个文件可以有多少状态?在我看来,至少有三种状态,“添加”(添加该文件后的状态)、“附加”(添加该文件后的状态)和“读取”(添加该文件后的状态)是必需的。一个互斥锁可能不足以控制三个状态。@Fumu Add/Append本质上是相同的,它们不应该被视为单独的状态。只有read是不同的,所以我想说这里仍然只有两个状态。@JeremyFriesner这不是pthread链接…但现在正在pthreads中搜索它。编辑:哇,只是一个例子链接到其他地方,没有使用pthreads。@JeremyFriesner补充说,如果您愿意的话,作为答案,我现在有了可用的代码,运行它只需要很少的更改。谢谢!听起来它可以工作。我有@JeremyFriesner的建议,幸运的是,这是一个更简单的解决方案。我确实想知道这是否就是该功能的实现方式不过实现了。信号量是以线程安全的方式进行计数的最简单的方法(它们是在pthreads中实现的)。由于您需要跟踪并发读卡器的数量,我打赌他们是这样做的。我心里想:有一天您必须查找这件事。
pthread_mutex_trylock(&(fm->mutex));//TRYLOCK [NonBlocking, so the thread can continue the read]
//do some things`
...
pthread_mutex_unlock(&(fm->mutex));