访问wait_event_timeout linux接口中的共享变量

时间:2013-05-23 20:59:30

标签: linux linux-kernel race-condition kernel

wait_event_timeout可用于使线程在指定时间内休眠或直到某些条件成立为止 我面临的情况是这个条件是一个共享变量。

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

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

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

1 个答案:

答案 0 :(得分:3)

如果变量足够小以至于可以原子方式更新,并且如果所有更新确实以原子方式发生(类似ACCESS_ONCE(shared_variable) = 1;),那么您可以使用问题中的代码。

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

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