我在Windows Mobile 应用程序中使用Radio Layer Interface (RIL) Native APIs。在此 API 中,大多数函数的返回值/结果不会立即返回,而是通过回调函数传递给 RIL API。
在XDA 开发工具和Google Gears Geolocation API中可以找到一些使用示例。
我的问题是,在这两个示例中,互斥锁用于保护数据而不是其他同步对象。
现在,在这两个示例描述的用例中,关键部分在这里会做得很好吗?哪个线程或进程将实际调用回调函数?
编辑:
我的代码只能从我的进程内部访问我的数据,但是哪个线程/进程正在调用 RIL API 中的回调函数?我的意思是,我向 RIL API 传递了一个函数回调,但是这些回调是从其他进程调用的吗?在这种情况下,它将给出样本使用互斥锁的另一种解释。如果 RIL API 实际上在我的进程中创建了一个线程并调用了我的回调函数,那么我认为关键部分会很好(而且它比互斥锁更快)。
更新:
我有(1)我的代码从我自己的进程中访问的数据,并且还(2)从函数回调中修改。回调由 RIL API 完成。
我的问题:哪个线程/进程正在调用 RIL API 中的回调函数?
到目前为止的故事:
我:嗨,RIL 先生,请把一些数据放到我的办公室(又名变量)。
RIL:好的,先生。我稍后会放数据,完成后我会向您发出信号(我在这里使用了一个事件)。
进入我的办公室需要一张门禁卡。如果 RIL 先生和我来自同一家公司,RIL 先生可以使用他自己的访问卡进入我的办公室(在我的情况下,这意味着一个关键部分)。如果他来自其他公司,我需要为他设置一张门禁卡/访客卡(在我的情况下,我需要一个互斥锁)。
如果RIL先生使用他自己的门禁卡,这意味着我不需要为他设置门禁卡/访客卡,这对我来说意味着更少的麻烦。(即临界区比互斥锁快)
问题是,我几天前才认识了这位RIL先生,对他了解不多。我不知道他和我是不是同一个公司的。nobugz提到的一种选择是为 RIL 先生设置访问卡,无论 RIL 先生是否与我来自同一家公司。这样,RIL 先生就可以保证能够进入我的办公室。(我的数据/变量保证是安全的)
现在我在我的代码中使用互斥锁(为 RIL 先生设置一个可能冗余的访问卡)。
啊哈!写这篇文章的时候突然想到了。我想我会问 RIL 先生他来自哪家公司。这样以后如果他和我在同一家公司,我就不用给他设置门禁卡了。(即把GetCurrentProcessId()
和GetCurrentThreadId()
放在回调函数中)