我想用以下模式编写一个循环,其中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;}
),有没有办法实现这个目的?
答案 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
}