在 while(1) 循环中提升互斥锁上的 scoped_lock

Posted

技术标签:

【中文标题】在 while(1) 循环中提升互斥锁上的 scoped_lock【英文标题】:boost scoped_lock on mutex in while(1) loop 【发布时间】:2013-07-18 16:54:57 【问题描述】:

我有 2 个进程共享一个由互斥锁和条件同步的队列。我的一个进程中有以下代码。

named_mutex mutex(open_only, "MyMutex");

int main()

   while(1)
   
      scoped_lock <named_mutex> lock(mutex)
      //do some processing 
   

我的问题是,互斥锁是否在 while 循环中的所有调用中都具有作用域,还是每次 while 循环开始时都需要获取它?解锁互斥锁的范围是什么?似乎每次在 while 循环结束时,互斥锁都被解锁了。

谢谢

【问题讨论】:

【参考方案1】:

它的行为与循环体中的任何其他局部变量完全相同:每次迭代都会创建和销毁一次。在这种情况下,它将在每次迭代时锁定和解锁互斥锁一次。

【讨论】:

【参考方案2】:

顾名思义,scoped_lock 在创建时(在其 ctor 中)锁定互斥体,并在删除时(在其 dtor 中)解锁。

由于lock 实例的范围在while 主体内,因此在创建scoped_lock 时会锁定互斥体,并在while 循环结束时解锁:应该是break 还是@987654327 @,甚至是 return 语句,或者只是在到达 while 主体的末尾时,每个循环一次。

【讨论】:

你的回答模棱两可; while 循环结束时 是什么意思?在每次迭代结束时,或者当你跳出循环时? 我使用了单数,一个循环,没有所有循环。确切的时间是程序超出while 范围,然后是找到breakcontinue 指令时,或者只是当它到达主体的末尾时。

以上是关于在 while(1) 循环中提升互斥锁上的 scoped_lock的主要内容,如果未能解决你的问题,请参考以下文章

在同一个互斥锁上的锁定和解锁顺序是不是一致?

在 C 中使用共享变量和互斥锁进行线程同步

如何在 C++ 中正确地在循环中使用互斥锁?

提升进程间锁持久性

互斥和条件变量区别

线程同步