我正在使用2.6.24.3内核为嵌入式Linux项目开发用户空间应用程序。我的应用程序通过创建2个pthread在两个文件节点之间传递数据,每个pthread都hibernate,直到异步IO操作完成,然后唤醒并运行完成处理程序。
完成处理程序需要跟踪待处理的传输数量,并维护几个线程列表,一个线程将添加到该列表中,而另一个线程将删除该列表。
// 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?
您可以使用sched_setscheduler()系统调用将线程的调度策略临时设置为SCHED_FIFO,然后再次将其重新设置。从sched_setscheduler()手册页:
sched_setscheduler()
SCHED_FIFO
甲SCHED_FIFO过程运行,直至其通过一个I / O请求阻塞,它是由较高优先级的进程抢占,或它调用sched_yield(2)。
sched_yield(2)
(在这种情况下,“进程”实际上是指“线程”)。
但是,这是一个可疑的要求。您希望解决什么问题?如果您只是试图保护完成处理程序的链接列表以防止并发访问,那么通常的互斥锁是可行的方法。让完成线程锁定互斥锁,删除列表项,解锁互斥锁,然后调用完成处理程序。