Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
以只读模式(C11 stdatomic)锁定结构的线程_C_Multithreading_Locking_Mutex_Atomic - Fatal编程技术网

以只读模式(C11 stdatomic)锁定结构的线程

以只读模式(C11 stdatomic)锁定结构的线程,c,multithreading,locking,mutex,atomic,C,Multithreading,Locking,Mutex,Atomic,我用stdatomic创建了一个类似互斥锁的锁函数,它基本上可以 do atomic_store(&zero, 0); while (!atomic_compare_exchange_weak(&mystructure->address, &zero, threadlocal_address)); atomic_fetch_add(&structure->locklevel, 1); 还有另一个解锁函数,该函数递减locklevel,并且仅当lock

我用stdatomic创建了一个类似互斥锁的锁函数,它基本上可以

do atomic_store(&zero, 0);
while (!atomic_compare_exchange_weak(&mystructure->address, &zero, threadlocal_address));
atomic_fetch_add(&structure->locklevel, 1);
还有另一个解锁函数,该函数递减locklevel,并且仅当locklevel==0时才将地址设置回零。这允许在调用调用另一个锁的函数之前进行锁定,允许它仍然保持锁定

这对RW锁定很好,但我也想让一个R-lock函数结构可以被多个函数读取,但尝试编写它[调用RW锁]会让它等待,我尝试简单地使用公共地址而不是本地线程地址


这种方法的问题是,如果许多线程在循环中调用R-lock,那么它将导致RW操作不足,因为locklevel永远不会(或者几乎永远不会)达到零。。。有什么想法吗?

您可以尝试对读写操作使用优先级。我假设您的系统中的rw/读取比率较低。为rw请求实现一个基本队列,当队列中有rw请求等待时,防止读取请求获取锁。当前读取请求完成后,获取rw锁并等待其完成。因此,只要有rw请求在队列中等待或当前正在运行,就可以阻止读取请求。当rw线程解锁且队列中不再有rw请求等待时,允许读取请求获取锁


您可能还需要使用条件变量,并根据您的实现向它们发送信号

作家饥饿是一个探索性很强的问题,但如果不了解由此产生的系统的预期特征,就很难解决。你考虑过读者与作者的比例吗?读写操作的长度?除了RW锁,还有许多其他因素和几种不同的解决方案。例如,您是否考虑过在写入时复制数据?@DarkFalcon我的结构包含指向动态分配内存的指针,因此这种方法在可能的情况下无法工作。深入复制所有内容,或者为给定外部指针的引用数量保留一个计数器。在任何情况下,如果您需要帮助选择一种方法,您都必须回答其他问题。@DarkFalcon是的,但分配的内存阵列可能很长,malloc本身就是一个昂贵的操作,除非您每5分钟只更改一次,否则在这种情况下,成本可能并不重要。您仍然需要指定系统的性能特征。