我可以防止在关键代码中产生Linux用户空间pthread吗?

我正在为使用2.6.24.3内核的embedded式Linux项目开发用户空间应用程序。 我的应用程序通过创build2个pthread来在两个文件节点之间传递数据,每个睡眠直到asynchronousIO操作完成,然后唤醒并运行完成处理程序。

完成处理程序需要跟踪有多less个传输正在等待处理,并维护一个线程将添加到另一个线程的链接列表,另一个将被删除。

// 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); } } 

我的问题是这个…

有没有一种简单的方法,我可以阻止当前活动的线程屈服,而它运行完成处理程序,而不是下去互斥/旋转locking路线?

或者失败了,可以configurationLinux以防止在互斥锁/旋转locking时产生pthread?

Solutions Collecting From Web of "我可以防止在关键代码中产生Linux用户空间pthread吗?"

您可以使用sched_setscheduler()系统调用将线程的调度策略临时设置为SCHED_FIFO ,然后再将其设置回去。 在sched_setscheduler()手册页中:

一个SCHED_FIFO进程一直运行,直到它被I / O请求阻塞,被优先级更高的进程抢占,或者调用sched_yield(2)

(在这种情况下,“过程”实际上是指“线程”)。

不过,这是一个相当可疑的要求。 你希望解决什么问题? 如果你只是试图保护你的完成处理程序的链接列表并发访问,那么一个普通的互斥量就是要走的路。 让完成线程锁定互斥锁,删除列表项,解锁互斥锁,然后调用完成处理程序。

我想你会想要使用互斥/锁来防止这里的竞争条件。 互斥体绝不是巫术的魔法,甚至可以使你的代码比使用任意系统特有的功能更简单,你可能需要跨系统移植。 不过,不知道后者是不是一个问题。

我相信你在这里试图超越Linux调度器,原因是错误的。

正确的解决方案是使用互斥锁来防止并行处理完成处理程序。 让调度程序完成它的工作。