- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要实现一种机制,该机制具有一个数据结构(此刻为队列),其中包含一个待处理的请求对象的列表,这些对象在使用时由不同的线程标记,在线程使用完该线程后将其删除。
在任何给定时间,此数据结构中最多可以包含数千个项目,并且N个线程将从中接收请求(本质上将其标记为“已接受”),然后当线程完成时,它将在结构中找到相同的请求,并且去掉它。
现在,我想知道C++ STL队列在执行此操作方面是否有效,以及在需要将其从队列中删除时是否必须再次查找同一项目?
我不希望这种数据结构被线程同步机制锁定太长时间,因为线程正在其中寻找某项。这可能会锁定我的整个程序。 (该程序必须具有很高的性能和速度)
谁能建议如何在多线程环境中最好地实现这一点,以使该结构在需要执行搜索时不会长时间锁定?
最佳答案
您可能正在关注什么不是您设计中最困难的部分。
如果队列是没有任何优先级的FIFO,那么您的访问器将是push_back()和pop_front()-即使您不麻烦使用比较交换(CAS)语义,但坚持使用a简单的互斥/关键部分。如果您需要对流量进行优先级排序的能力,则事情会变得更加艰难。如果您确实使用CAS锁定,那么(无论如何在Windows上)您都无法在boost::thread的shared_mutex上进行改进,而不会花费太多时间来进行这部分编码。不确定非Windows实现。
此问题最复杂的部分通常是发信号通知空闲的工作程序线程来接管新工作。在queue.front()为非空之前,您不能让它们循环,因此您需要一种方法来确保踢出正确数量的空闲线程来拾取排队的项目。当工作线程空闲时,它可以检查是否有新工作,如果不是,则执行,否则队列状态需要设置为空闲,以便下一个push_back导致“唤醒”踢,以重新启动工作线程池。该区域必须对所有非致命异常都具有100%的鲁棒性,否则您的流程将变得一片漆黑。
您是在管理自己的线程还是在使用内置线程池?您是否打算拥有一个动态大小的线程池,或者只是生成N个线程(可能是可配置的)并使它们运行直到进程退出?
绝对有工作线程执行工作项过程的日志记录。了解谁在其生命周期的任何阶段都拥有工作项至关重要。停止/开始工作,以及工作项摘要和时间安排将很有用。如果日志记录很慢,则通过即发即弃队列将其推送到单独的线程,但是您必须注意那里的延迟,这会降低日志的实用性。如果您确实需要从外部操纵进行中的工作项的能力,则从挂起的工作队列中选择一个单独的结构-通过线程索引并显示当前状态/开始时间并进行单独锁定的进行中的工作项,听起来是个好主意。此结构将是O(线程数),因此小于“待处理”队列,因此,如果长时间运行的结果操作在结构锁之外完成,则扫描它就不会成为瓶颈。
关于性能-您的工作线程将要做什么?如果工作项需要长期运行,执行大量I/O或其他昂贵的操作,那么队列交互并不是您的性能瓶颈,因此对该区域进行过度优化相对而言是无济于事的。在您的设计中考虑整个系统的性能,而不仅仅是一小部分。
这仅适合初学者。祝您好运,这不是一个易于健壮设计的系统。
[编辑]基于工作项描述。
解析应该很快(尽管可能涉及昂贵的源数据检索-很难说吗?),而数据库访问则要少一些。听起来,调优数据库可能是您在性能方面最大的收获。如果您对此无能为力,则只需要尽可能减少设计中的慢速DB。如果您可以选择执行异步数据库访问,则工作线程可以执行足够的工作来启动数据库调用,然后完成回调中的工作,从而允许在工作线程上启动其他工作。如果没有异步数据库访问,那么如果没有其他间接方法(您的主工作线程不等待数据库调用完成内联),将很难实现可靠的请求超时。您需要使主工作线程与对数据库的依赖脱钩,除非您可以信任数据库及时返回或出错。也许对数据库请求有一些可配置的或特定于工作项的超时? DB API库通常允许这样做。
您的超时监控器需要保持对工作项状态的了解。可能在您的工作项上使用一些虚拟的Cancel()方法,以确保灵活地清理超时项目。
关于c++ - 多线程访问的高效结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3634589/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!