在循环控制条件内调用void函数

时间:2015-01-22 15:09:52

标签: c

我想用以下模式编写一个循环,其中spin_lock的返回类型为void

while(workersAvailable() && spin_lock(workQueueLock) && (!list_empty(workQueue) || spin_unlock(workQueueLock)) ) {
   ...
   spin_unlock(workQueueLock);
   //long taking work, with no need for a lock
}

推理:

  • 我希望锁定尽可能短,workersAvailable()
  • 不需要它
  • 我知道我可以写一个函数int f() {spin_lock(workQueueLock); return !list_empty(workQueue) || spin_unlock(workQueueLock);},但我觉得应该有更好的方法
  • 我确实理解&& void无法正常工作,因为&&需要两个操作数
  • 我尝试,并且它不会编译,除了我不确定,是否保证操作的顺序。

问题:如果没有额外的功能且没有在循环体内移动控制逻辑(即spin_lock(workQueueLock); if(list_empty(workQueue)) { || spin_unlock(workQueueLock); break;}),有没有办法实现这个目的?

2 个答案:

答案 0 :(得分:3)

如果你真的想这样做,可以使用,运算符,它会丢弃仅评估最后一个的所有左操作数

while(workersAvailable() && 
    (spin_lock(workQueueLock), 1) && 
    (!list_empty(workQueue) || spin_unlock(workQueueLock)))

但在我看来,你应该写这个函数,它更清楚。

答案 1 :(得分:0)

简单有什么问题?

while(workersAvailable() && spin_lock(workQueueLock) ) { 
    if (list_empty(workQueue)) {
        spin_unlock(workQueueLock);
        continue;
        }       
   // critical section ...
   spin_unlock(workQueueLock);
   // non-critical section
   // long taking work, with no need for a lock
   // You *could* break out of the loop here
}

更新:(我误解了这个问题,并认为spin_unlock()无效)

while(workersAvailable() ) {
    spin_lock(workQueueLock); 
    if (list_empty(workQueue)) {
        spin_unlock(workQueueLock);
        continue;
        }       

   // critical section here ...

   spin_unlock(workQueueLock);

   // non-critical section

   // long taking work, with no need for a lock
   // You *could* break out of the loop here
}