我正在尝试使用获取和增量算法(类似于烘焙算法)在c中实现互斥锁。我已经实现了fetch并以原子方式添加了部分。我让每个帖子都获得一个票号并等待他们的号码显示"。但是,我还没有办法解决等待机票显示的问题。我曾经想过使用一个队列存储你的线程ID,然后自己解压/收益,直到有锁定的人唤醒你。但是,我还需要锁定队列! :(
是否有任何关于如何使队列插入安全或使用不同方法来使用队列的建议?
以下是我最初实施的一些代码:
void mutex_lock( mutex_t *mp ) {
while (compareAndSwap(&(mp->guard), 0, 1) == 1) {
// This will loop for a short period of time, Need to change this <--
}
if ( mp->lock == 1 ) {
queue_elem_t elem;
elem.data.tid = gettid();
enq( &(mp->queue), &(elem) );
mp->guard = 0;
deschedule();
}
else {
mp->lock = 1; // Lock the mutex
mp->guard = 0; // Allow others to enq themselves
}
}
另外,现在让我们忽略潜在的竞争条件,有人可以在调用deschedule之前调用make_runnable,我可以编写另一个系统调用,它会说我们将要解决,因此队列make_runnable调用。