我想在文件描述符和互斥锁上等待,建议的方法是什么?
我想生成线程来执行某些任务,并使用线程安全队列与它们进行通信。在我等待的时候,我也想对各种文件描述符做IO。
推荐的方法是什么?我是否必须创建一个线程间管道并在队列从无元素转到某些元素时写入它?有没有更好的方法?
如果我必须创建线程间管道,为什么实现共享队列的更多库不允许您将共享队列和线程间管道创建为单个实体?
我想这样做的事实是否意味着一个基本的设计缺陷?
我问这个关于C ++和Python的问题。我对跨平台解决方案略感兴趣,但主要对Linux感兴趣。
更具体的例子......
我有一些代码将搜索文件系统树中的东西。我有几个通过套接字向外界开放的通信渠道。可能(或可能不)导致需要搜索文件系统树中的内容的请求将到达。
我将隔离在一个或多个线程中搜索文件系统树中的东西的代码。我想接受这样的请求,这些请求导致需要搜索树并将它们放入由搜索器线程完成的线程安全队列中。结果将被放入已完成搜索的队列中。
我希望能够在搜索过程中快速为所有非搜索请求提供服务。我希望能够及时对搜索结果采取行动。
处理传入的请求通常意味着某种使用
epoll
的事件驱动架构。磁盘搜索请求队列和结果返回队列意味着一个线程安全队列,它使用互斥锁或信号量来实现线程安全。
等待空队列的标准方法是使用条件变量。但是,如果我需要在等待期间提供其他请求,那将无效。我最终一直在轮询结果队列(并且平均将结果延迟轮询间隔的一半),阻塞而不是服务请求。
没有找到相关结果
已邀请:
8 个回复
磐去裸猜饲
列表中,用于分别从另一个线程或定时器事件触发时跳出
。 还有另一种选择,那就是信号。可以使用
修改文件描述符,以便在文件描述符变为活动时发出信号。然后,信号处理程序可以将文件就绪消息推送到您选择的任何类型的队列上。这可能是一个简单的信号量或互斥/ condvar驱动的队列。由于现在不再使用
/
,因此不再需要使用管道来排队基于文件的消息。 健康警告:我没有尝试过,虽然我不明白为什么它不起作用,但我真的不知道
方法的性能影响。
粱委教
闲窍
犯痪桂涛杭
春驹晴陪
/
/ etc。在你的“主线程”中。在I / O操作完成时,启动一个专用的辅助线程来执行I / O并将通知推送到线程安全队列(与其他线程用来与主线程通信的队列)。 然后你的主线程只需要等待通知队列。
耐钨徒
磋判粗惊
它是单线程(主线程),基于epoll的服务器框架。问题是,它是单线程的,而不是多线程的。它要求proc()永远不会阻塞或运行很长时间(例如,对于常见情况,为10毫秒)。 如果proc()将运行很长时间,我们需要MULTI THREADS,并在一个单独的线程(工作线程)中执行proc()。 我们可以在不阻塞主线程的情况下向工作线程提交任务,使用基于互斥锁的消息队列,它足够快。
然后我们需要一种从工作线程获取任务结果的方法。怎么样?如果我们只是在epoll_wait()之前或之后直接检查消息队列。
但是,检查操作将在epoll_wait()结束后执行,而epoll_wait()通常会阻塞10微秒(常见情况),如果它等待的所有文件描述符都不活动。 对于服务器,10毫秒是相当长的时间!我们可以发信号通知epoll_wait()在生成任务结果时立即结束吗? 是!我将在我的一个开源项目中描述它是如何完成的: 为所有工作线程创建管道,epoll也在该管道上等待。生成任务结果后,工作线程将一个字节写入管道,然后epoll_wait()将在几乎相同的时间内结束! - Linux管道有5到20美元的延迟。 在我的项目SSDB(兼容Redis协议的磁盘NoSQL数据库)中,我创建了一个SelectableQueue,用于在主线程和工作线程之间传递消息。就像它的名字一样,SelectableQueue有一个文件描述符,可以通过epoll等待。 SelectableQueue:https://github.com/ideawu/ssdb/blob/master/src/util/thread.h#L94 在主线程中的用法:
工作线程中的用法:
琳娘