使用互斥锁在C中进行首次读者 - 编写器解决方案实施有什么问题?

时间:2016-05-02 04:27:49

标签: c linux multithreading mutex readerwriterlock

我正在尝试在C中实现第一个读者编写者问题(读者的偏好)。我正在使用互斥锁和解锁来确保如果读者有锁和任何读者,没有作家可以访问该线程如果第一个阅读器有锁,则可以访问该线程。这是我的代码。我无法得到我的代码直到结束,即它没有到达线程连接部分。我想我在某个地方遇到了僵局,或者我正在放置我的互斥锁并在错误的地方解锁。

 date=2016-04-11 time=11:26:29 logid=0000000013 type=traffic
 subtype=forward level=notice vd=root srcip=10.10.24.232 srcport=35321
 srcintf="port2" dstip=173.252.74.22 dstport=443 dstintf="wan1"
 poluuid=426a22f0-b2d8-51e5-4e06-b3d158ed335f sessionid=11469008
 proto=6 action=deny policyid=33 dstcountry="United States"
 srccountry="Reserved" trandisp=snat transip=202.166.220.127
 transport=35321 service="HTTPS" appid=15832 app="Facebook"
 appcat="Social.Media" apprisk=medium applist="GEN-ACC-FBBLK"
 appact=drop-session duration=22 sentbyte=120 rcvdbyte=60 sentpkt=2
 utmaction=block countapp=1 utmref=62972-2591658 date=2016-04-11
 time=11:26:29 logid=0000000013 type=traffic subtype=forward
 level=notice vd=root srcip=10.10.37.60 srcport=43857 srcintf="port2"
 dstip=202.166.193.187 dstport=443 dstintf="wan1"
 poluuid=426a22f0-b2d8-51e5-4e06-b3d158ed335f sessionid=11373387
 proto=6 action=close policyid=33 dstcountry="Nepal"
 srccountry="Reserved" trandisp=snat transip=202.166.220.127
 transport=43857 service="HTTPS" appid=41542 app="SSL_TLSv1.0"
 appcat="Network.Service" apprisk=medium applist="GEN-ACC-FBBLK"
 appact=detected duration=424 sentbyte=1320 rcvdbyte=1582 sentpkt=10
 rcvdpkt=16 utmaction=allow countapp=2 utmref=62972-2591632

1 个答案:

答案 0 :(得分:3)

你的代码很乱。它有几个问题,每一个都破坏了你试图实现的RW锁定机制。

  • 您的读者线程和编写器线程都需要处理读者排除和编写者排除。您当前的代码完全忽略了编写器线程中的读者排除。
  • 您的编写器线程正在从共享结构(if (account_list[i].accno == update_acc[j].accno))读取而不排除其他编写者。
  • 我认为这不仅仅是因为您似乎正在努力实现的互斥体。例如,关键部分的最后一个读者线程需要能够让等待的作者去。您可能至少需要条件变量或信号量才能执行此操作。

我的建议是使用POSIX pthread_rwlock_init和朋友。

如果您坚持自己这样做,那么请至少阅读这篇Concurrent Control with "Readers" and "Writers"论文,以获得有关如何实施该论文的灵感。