gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:06 30 4
gpt4 key购买 nike

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

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

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

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

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/

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