我正在使用2.6.24.3内核为嵌入式Linux项目开发用户空间应用程序。 我的应用程序通过创建2个pthread来在两个文件节点之间传递数据,每个睡眠直到异步IO操作完成,然后唤醒并运行完成处理程序。我可以防止在关键代码中产生Linux用户空间pthread吗?
完成处理程序需要跟踪有多少个传输处于挂起状态,并维护一个线程将添加到另一个线程并将另一个线程移除的链接列表。
// sleep here until events arrive or time out expires
for(;;) {
no_of_events = io_getevents(ctx, 1, num_events, events, &timeout);
// Process each aio event that has completed or thrown an error
for (i=0; i<no_of_events; i++) {
// Get pointer to completion handler
io_complete = (io_callback_t) events[i].data;
// Get pointer to data object
iocb = (struct iocb *) events[i].obj;
// Call completion handler and pass it the data object
io_complete(ctx, iocb, events[i].res, events[i].res2);
}
}
我的问题是这样的......
有一个简单的办法可以防止当前活动的线程产生,而它运行完成处理,而不是下降互斥/自旋锁路线?
或者失败了,可以配置Linux来防止在持有互斥锁/自旋锁时产生pthread?
该要求主要是试图保持代码简单,有几个项目需要在完成处理程序中互斥,但如果您可以确保它只会在处理程序之外产生,我认为您不需要任何。 我想另一种选择是在整个处理程序周围放一个粗糙的互斥体。 – KermitG 2010-05-19 15:10:33
@KermitG:如果您担心完成处理程序代码本身与另一个线程中的代码竞争,那么只需防止抢占将无济于事。当完成处理程序启动时,另一个线程可能已经在临界区内;即使在完成处理程序运行时暂停它,它仍然会看到它正在处理的数据将从其下方更改。通常,如果处理程序中的代码可以竞争,则处理程序本身应负责锁定。 – caf 2010-05-19 21:47:49