繁体   English   中英

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

[英]Can I prevent a Linux user space pthread yielding in critical code?

我正在使用2.6.24.3内核为嵌入式Linux项目开发用户空间应用程序。 我的应用程序通过创建2个pthread在两个文件节点之间传递数据,每个pthread都休眠,直到异步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_FIFO进程将一直运行,直到被I / O请求阻止,被更高优先级的进程抢占或调用sched_yield(2)

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

但是,这是一个可疑的要求。 您希望解决什么问题? 如果您只是试图保护完成处理程序的链接列表以防止并发访问,那么通常的互斥锁是可行的方法。 让完成线程锁定互斥锁,删除列表项,解锁互斥锁,然后调用完成处理程序。

我认为您会希望使用互斥锁/锁定来防止出现竞争情况。 互斥体绝对不是巫毒术,甚至比使用任意系统特定功能(甚至可能需要跨系统移植)使代码更简单。 不过,不知道后者是否对您来说是个问题。

我相信您由于错误的原因而试图在这里超越Linux调度程序。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM