wait_event_timeout
可用于使线程在指定时间内休眠或直到某些条件成立为止
我面临的情况是这个条件是一个共享变量。
ret = wait_event_timeout(SLEEP_Q,shared_vaible == 1,TIME_TO_SLEEP);
在调用之前,我必须放弃用于访问共享变量的spinlock
。
所以我的问题是,由于在不使用锁的情况下读取共享变量,正确性是否会受到影响?
内核是否确保wait_event
接口中的这些条件不具有竞争条件?
答案 0 :(得分:3)
如果变量足够小以至于可以原子方式更新,并且如果所有更新确实以原子方式发生(类似ACCESS_ONCE(shared_variable) = 1;
),那么您可以使用问题中的代码。
否则,您必须在读取变量时获取锁定。 最好的方法是创建一个简单的辅助函数:
ret = wait_event_timeout(SLEEP_Q, read_shared_variable() == 1, TIME_TO_SLEEP);