我对* nix系统上的POSIX Pthreads中的读写锁定有一些疑问,例如Linux。
我想知道读写锁定的默认偏差是什么,即,它优先于读取而不是写入,反之亦然?它是否提供一些api来更改此默认行为。
posix
pthread是否提供一些api,以便我们可以更改pthread_rwlock_t来防止作者饥饿?从我所阅读的内容(如果我错了,请纠正我),默认实现偏向于读者线程,因此作家线程可能会面临饥饿。
我已经阅读了David Butenhof撰写的《用Posix线程编程》一书中的rw lock示例实现。
我想知道posix
pthreads如何处理作家线程的饥饿?是否有一些api可以用来设置读写锁定的属性,从而防止出现饥饿现象(我从未听说过)?还是用户必须处理这个问题?
如果您认为答案是实现定义的,那么请举个例子说明如何在Linux中完成它,因为这就是我想要的。
请注意,我只想要* nix系统的解决方案。 不要以为我很粗鲁,但是发布一些Windows特定的代码对我来说毫无用处。
谢谢大家的帮助和耐心:)
这确实取决于实现-因此,由于您是专门询问Linux的,所以我的评论是针对当前pgTL的NPTL实现的,该实现在现代glibc中使用。
这里有两个相关但独立的问题。首先,有这种情况:
此处的默认操作是允许阅读器继续进行-
有效地在编写器上“跳过队列”。但是,您可以覆盖它。如果您使用该pthread_rwlockattr_setkind_np()
函数PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
在attr
传递给的上设置标志pthread_rwlock_init()
,则在上述情况下,您的rwlock将阻止阅读器。
第二种情况是:
在这种情况下,NPTL总是会优先于读者唤醒作家。
综上所述,上面的意思是如果您使用该PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
标志,那么您的作家不应该挨饿(当然,现在连续不断的作家流可以使读者挨饿
。C’est la vie
)。您可以通过检查pthread_rwlock_rdlock.c和pthread_rwlock_unlock.c中的源(都非常可读1)来确认所有这些内容。
请注意,还有一个PTHREAD_RWLOCK_PREFER_WRITER_NP
,但它似乎 没有 起到正确的作用-很有可能是一个错误( _或可能没有-
1. …或者至少是在我2010年撰写此答案时。NPTL的最新版本要复杂得多,而且我还没有做过分析。
我对这段代码有一个问题。这是典型的读者-作家问题。我按照这个维基百科页面上的伪代码找到了第一个让作者挨饿的问题。我想知道我实际上是如何注意到作家们正在挨饿的。 我试着把shared_variable的打印声明放在不同的地方,但这并没有给我太多的洞察力。但也许我只是不明白发生了什么。有人能向我解释一下我是如何直观地看到饥饿发生的吗?谢谢你!读取器或写入器尝试读取或写入的次数作为命令行参数给出。
我有一个多线程的JEE应用程序,运行选择更新限制1;使用WHERE子句对表进行查询,并在每个事务中更新行,这将创建行级写锁,并且不会阻止读取器进行读取。 有什么方法可以配置postgres,来阻止读者用写锁读取行?
我的应用程序收到大量传入的 HTTP 请求。在每个请求的标头中,都有一个键值对。 说出标题1=应用程序1 值App1不断变化。 所以接下来它可以是App2、App3等等。 .但是,这些值可以按任何顺序继续出现。我需要处理竞争条件,其中如果出现 App1 的多个请求,我获得 reentrantreadwritellock 在App1上。同时,如果我收到对App2的请求,我将获取App2的重入读写锁。
维基百科上说,下面的代码“增加了不允许任何线程饿死的限制”,我不明白为什么没有饿死。例如:如果有很多作者在任何读者之前到达,并且第一个作者花了很长时间完成他的写作,那么r可能会达到一些大的负数,比如说-12345,然后读者开始与作者一起到达,不知怎的,操作系统总是选择writer来接收信号量,而不是reader,如果那样的话,读者会挨饿,这是对的还是我错了?链接:读者和作者问题 请看链接中的第三个
我想锁定写入Ultralight C的内存区域。我们可以在文档中看到,如果我将0x2B页设置为0xFF,写访问将受到限制,如果我设置0x00,写访问和读访问都将受到限制。 事实上,我设置了带有0xFF的0x2B页面,后来的页面0x2A带有0x04以锁定内存访问。它运行良好,但是当我尝试从0x04读取任何页面时,它会响应 63 00 有人做了我想做的事吗?
9.3. sync.RWMutex读写锁 在100刀的存款消失时不做记录多少还是会让我们有一些恐慌,Bob写了一个程序,每秒运行几百次来检查他的银行余额。他会在家,在工作中,甚至会在他的手机上来运行这个程序。银行注意到这些陡增的流量使得存款和取款有了延时,因为所有的余额查询请求是顺序执行的,这样会互斥地获得锁,并且会暂时阻止其它的goroutine运行。 由于Balance函数只需要读取变量的状态