2

wait_event_timeout可用于使线程休眠指定时间或直到某些条件变为真。
我面临这种情况是共享变量的情况。

ret = wait_event_timeout(SLEEP_Q,shared_vaible == 1,TIME_TO_SLEEP);

在调用它之前,我必须放弃spinlock用于访问共享变量的。

所以我的问题是,由于共享变量是在不使用锁的情况下读取的,因此正确性是否会受到影响?
内核是否确保wait_event接口中的此类条件没有竞争条件?

4

1 回答 1

3

如果变量足够小,可以自动更新,并且所有更新确实都是自动发生的(例如ACCESS_ONCE(shared_variable) = 1;),那么您可以使用问题中的代码。

否则,您必须在读取变量时获取锁。最好的方法是创建一个简单的辅助函数:

ret = wait_event_timeout(SLEEP_Q, read_shared_variable() == 1, TIME_TO_SLEEP);
于 2013-05-24T07:24:15.540 回答