我是Linux设备驱动程序和内核的新手。我基本上想要将一个workque线程(让它称之为A())与另一个函数同步(让我们称之为B())。我的目的是在A运行时失败B.
目前,我所做的工作如下。
A(){
active = true; // a variable shared b/w both A and B
...
...
...
active = false;
}
B(){
if(active){
return -EBUSY
}
}
这是同步这两个功能的正确方法吗?我还应该遵循其他策略吗?
答案 0 :(得分:1)
对于Linux内核它的代码不好。尝试阅读互斥和信号量。
http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=5
答案 1 :(得分:1)
你为什么要这样做?
A :mmc_rescan()
定义为INIT_DELAYED_WORK(&host->detect, mmc_rescan);
B :mmc_suspend_host()
中的第一行代码为cancel_delayed_work(&host->detect);
因此 B 中取消 A 。这是出于某种原因,由 this commit 带来。
那么用另一个同步替换此取消的原因是什么?如果您的内核中没有此提交,只需将其拉出(cherry-pick),它可能会解决您的问题。
请参阅下一个提交,他们更改MMC暂停行为:
答案 2 :(得分:0)
您应该定义一个互斥锁,并在代码中有共享变量时使用它,这里是Linux内核Linux Mutexes and Conditions中的互斥和条件函数的实现