使用 ASIO 的线程池 - 线程退出,任务未执行

2024-02-24

我正在使用 Boost ASIO 用 C++ 编写一个 ThreadPool 类。以下是我迄今为止编写的代码:

线程池类

    using namespace std;
    using namespace boost;

    class ThreadPoolClass {
    private:

        /* The limit to the maximum number of threads to be
         * instantiated within this pool 
         */
        int maxThreads; 
        /* Group of threads in the Pool */
        thread_group threadPool;

        asio::io_service asyncIOService;

        void _Init()
        {
            maxThreads = 0;
        }
    public:
        ThreadPoolClass();
        ThreadPoolClass(int maxNumThreads);
        ThreadPoolClass(const ThreadPoolClass& orig);
        void CreateThreadPool();
        void RunTask(JobClass * aJob);
        virtual ~ThreadPoolClass();

    };
    ThreadPoolClass::ThreadPoolClass() {
    _Init();
    }



ThreadPoolClass::ThreadPoolClass(int maxNumThreads) {
    _Init();
    maxThreads = maxNumThreads;
}

void ThreadPoolClass::CreateThreadPool() {

    asio::io_service::work work(asyncIOService);

    for (int i = 0; i < maxThreads; i++) {
        cout<<"Pushed"<<endl;
        threadPool.create_thread(bind(&asio::io_service::run, &asyncIOService));
    }
}

void ThreadPoolClass::RunTask(JobClass * aJob) {
    cout<<"RunTask"<<endl;
    asyncIOService.post(bind(&JobClass::Run,aJob));
}

ThreadPoolClass::ThreadPoolClass(const ThreadPoolClass& orig) {
}

ThreadPoolClass::~ThreadPoolClass() {
    cout<<"Kill ye all"<<endl;
    asyncIOService.stop();
    threadPool.join_all();
}

工作类别

using namespace std;

class JobClass {
private:
    int a;
    int b;
    int c;

public:

    JobClass() {
        //Empty Constructor
    }

    JobClass(int val) {
        a = val;
        b = val - 1;
        c = val + 1;
    }

    void Run()
    {
        cout<<"a: "<<a<<endl;
        cout<<"b: "<<b<<endl;
        cout<<"c: "<<c<<endl;
    }

};

Main

using namespace std;

int main(int argc, char** argv) {

    ThreadPoolClass ccThrPool(20);
    ccThrPool.CreateThreadPool();
    JobClass ccJob(10);
    cout << "Starting..." << endl;
    while(1)
    {
        ccThrPool.RunTask(&ccJob);
    }
    return 0;
}

所以,基本上我正在创建 20 个线程,但截至目前仅发布一个由 ioservice 运行的(相同)任务(只是为了让事情简单并找到根本原因)。以下是我在 GDB 中运行该程序时的输出:

Pushed
[New Thread 0xb7cd2b40 (LWP 15809)]
Pushed
[New Thread 0xb74d1b40 (LWP 15810)]
Pushed
[New Thread 0xb68ffb40 (LWP 15811)]
Pushed
[New Thread 0xb60feb40 (LWP 15812)]
Pushed
[New Thread 0xb56fdb40 (LWP 15813)]
Pushed
[New Thread 0xb4efcb40 (LWP 15814)]
Pushed
[New Thread 0xb44ffb40 (LWP 15815)]
Pushed
[New Thread 0xb3affb40 (LWP 15816)]
Pushed
[New Thread 0xb30ffb40 (LWP 15817)]
Pushed
[New Thread 0xb28feb40 (LWP 15818)]
Pushed
[New Thread 0xb20fdb40 (LWP 15819)]
Pushed
[New Thread 0xb18fcb40 (LWP 15820)]
Pushed
[New Thread 0xb10fbb40 (LWP 15821)]
Pushed
[New Thread 0xb08fab40 (LWP 15822)]
Pushed
[New Thread 0xb00f9b40 (LWP 15823)]
Pushed
[New Thread 0xaf8f8b40 (LWP 15824)]
Pushed
[New Thread 0xaf0f7b40 (LWP 15825)]
Pushed
[New Thread 0xae8f6b40 (LWP 15826)]
Pushed
[New Thread 0xae0f5b40 (LWP 15827)]
Pushed
[New Thread 0xad8f4b40 (LWP 15828)]
Starting...
RunTask
Kill ye all
[Thread 0xb4efcb40 (LWP 15814) exited]
[Thread 0xb30ffb40 (LWP 15817) exited]
[Thread 0xaf8f8b40 (LWP 15824) exited]
[Thread 0xae8f6b40 (LWP 15826) exited]
[Thread 0xae0f5b40 (LWP 15827) exited]
[Thread 0xaf0f7b40 (LWP 15825) exited]
[Thread 0xb56fdb40 (LWP 15813) exited]
[Thread 0xb18fcb40 (LWP 15820) exited]
[Thread 0xb10fbb40 (LWP 15821) exited]
[Thread 0xb20fdb40 (LWP 15819) exited]
[Thread 0xad8f4b40 (LWP 15828) exited]
[Thread 0xb3affb40 (LWP 15816) exited]
[Thread 0xb7cd2b40 (LWP 15809) exited]
[Thread 0xb60feb40 (LWP 15812) exited]
[Thread 0xb08fab40 (LWP 15822) exited]
[Thread 0xb68ffb40 (LWP 15811) exited]
[Thread 0xb74d1b40 (LWP 15810) exited]
[Thread 0xb28feb40 (LWP 15818) exited]
[Thread 0xb00f9b40 (LWP 15823) exited]
[Thread 0xb44ffb40 (LWP 15815) exited]
[Inferior 1 (process 15808) exited normally]

我有两个问题:

  1. 为什么我的帖子会退出,即使我正在发帖 while 循环中的任务?
  2. 为什么 JobClass 的输出是变量 a,b 的值 并且 c 没有被打印?

我认为发生这种情况是因为您在 CreateThreadPool 方法中创建了工作对象,当超出范围时该对象会自动销毁 -> 在这种情况下 io_service 没有活动工作并且不处理您的任务。

尝试创建 ThreadPool 类的“工作”实例变量,而不是方法中的本地变量。

class ThreadPoolClass {
private:

    thread_group threadPool;

    asio::io_service asyncIOService;

    std::auto_ptr<asio::io_service::work> work_;

public:
};



ThreadPoolClass::ThreadPoolClass(int maxNumThreads) {
    _Init();
    maxThreads = maxNumThreads;
}

void ThreadPoolClass::CreateThreadPool() {

    work_.reset(new asio::io_service::work(asyncIOService));

    for (int i = 0; i < maxThreads; i++) {
        cout<<"Pushed"<<endl;
        threadPool.create_thread(bind(&asio::io_service::run, &asyncIOService));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASIO 的线程池 - 线程退出,任务未执行 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 我们可以对类型类进行抽象吗?

    我想知道我们不能对类型类进行抽象是否有更深层次的原因 或者我们可以吗 例如 当我们有 fzip forall a a gt a gt b gt c gt b c fzip f xs ys zip f xs f ys 那么我们可以说 fzip
  • 无法让 git 与 iconv 和 utf-16 很好地配合

    我试图让 git 将 UTF 16 识别为文本 以允许我本地比较和修补文本 但我无法获取textconv参数来工作 我可以手动调用 iconv f utf 16 t utf 8 some utf 16 file rc 一切都很好 但是如果我
  • 如何获取 CodenameOne TextField 中每次更改的事件

    我正在使用 CodenameOne 构建一个应用程序 并希望使用 TextField 来过滤一长串项目 我尝试使用 DataChangedListener 如建议的那样https www codenameone com javadoc co
  • 如何获取 QTreeWidget 的项目数

    我创建了一个 QTreeWidget 我正在尝试列出所有显示的项目 如果该项目有子项但未扩展 我不想进入该项目 它确实获取了我在树中可以看到的项目数量 我努力了 for int i 0 i lt MyTreeWidget gt topLev
  • iOS客户端服务器方法

    我熟悉其他平台上用于点对点或客户端 服务器消息传递的 SOAP 和 Web 服务 苹果的消息传递功能是什么 我正在尝试组装一个应用程序服务器来管理协作工作环境 LAN 上平均有 200 个 最多 1000 个移动客户端 例如 一台 Mac
  • Android 从自己的服务器自动更新

    我一直在寻找一个很好的例子 如何更新我自己开发的应用程序 因此 我的设备上安装了一个 apk 当我启动它时 我想检查我的服务器上是否存在任何更新 如果是 则从网络服务器下载并安装 首先我必须检查我的服务器是否有任何更新 如果是 则下载并安装
  • 在Android(使用Java)中,如何设置铃声音量(指定的数字)?

    因此 在我的应用程序中 我有一个搜索栏 允许用户设置铃声音量 0 100 我似乎找不到将铃声音量设置为指定数字的方法 我浏览了音频管理器 http d android com reference android media AudioMan
  • 如何使用 MapKit 绘制两个位置之间的路线并绘制要点?

    我正在使用 MapKit api 获取地图上的当前位置 并绘制由落针指向的两个位置之间的路线 我还想获取其路线之间的所有主要看台 我正在使用下面的函数来获取两个位置之间的路线 NSArray getRoutePointFrom MyLoca
  • 如何使用 Rust SDK 在 Aptos 上执行 Move 脚本?

    我想执行这个 Move 脚本 例如在sources top up move script use std signer use aptos framework aptos account use aptos framework aptos
  • 用C语言创建进程树

    我将如何创建一个看起来像深度为 N 的平衡三元树的流程层次结构 意味着每个进程有 3 个子进程 因此深度 N 的树中将有 3 N 1 2 个进程 要创建新进程 我只想使用 fork 这是我到目前为止所拥有的 但我认为它不起作用 因为我不处理
  • 如果缓冲区大小超过 256,第二个 MPI_Send 将挂起

    int n j i i2 i3 rank size rowChunk cells cellChunk MPI Status status MPI Init argc argv MPI Comm rank MPI COMM WORLD ran
  • SetForegroundWindow:ForegroundLockTimeout 注册表值和 SPI_GETFOREGROUNDLOCKTIMEOUT WinAPI 参数之间的关系

    Context 这个问题是关于如何通过配置控制是否允许编程跨进程窗口激活 使窗口成为具有输入焦点的前台窗口 通过SetForegroundWindow https learn microsoft com en us windows win3
  • 如何获取本地计算机上所有 MS SQL Server 实例的列表?

    这似乎是一个相当常见的问题 但我见过的答案都不是特别令人满意 我想要获取本地计算机上安装的 MS SQL Server 实例的名称列表 无论它们是否已启动 出于本次讨论的目的 我可以只查找 SQL 2005 及更新版本的实例 我可以使用 传
  • 自动完成 (jQuery UI) 和本地存储

    我在使用这两个工具时遇到了一个奇怪的错误 我正在对 API 进行 AJAX 查询 然后检索存储在 localStorage 中并显示在自动完成面板中的 JSON 数据 问题是 根据自动完成源的来源 面板会有不同的反应 这是 AJAX 成功时
  • Google 跟踪代码管理器:跟踪“选择”下拉菜单“选项”标签值

    我无法跟踪 选择 标签中 选项 标签的值 我目前有一个 Google Translator Widget 的下拉菜单 用户可以单击它并选择语言 当您单击 选择语言 下拉菜单时 您将能够看到德语选项 请参阅随附的屏幕截图 我在 Google
  • 显示个人用户评级(letrate gem)

    我目前正在使用 Letsrate gem https github com muratguzel https github com muratguzel 在我的应用程序中 评级显示正确 但是 我想显示单个用户提交的评分 而不仅仅是显示平均值
  • preg_match错误未知修饰符“{”[重复]

    这个问题在这里已经有答案了 这有什么问题吗 if preg match a zA Z 1 7 POST naam and preg match lt gt a zA Z0 9 POST password 第一个正则表达式我想要一个 1 7
  • Github 操作:npm install -> 错误:进程已完成,退出代码 1

    我的这个 GitHub 操作工作流程已经运行了一年多了 当我到达运行 npm install 的步骤时 突然出现错误 我真的不知道为什么会触发错误 非常感谢有人帮助或至少为我指明正确的方向 如果您需要更多数据 请告诉我 我将编辑问题 我尝试
  • 使用 OS X 的情节提要初始化另一个窗口

    我在 Xcode6 中创建了一个使用故事板的 Cocoa 应用程序 作为模板 Xcode 为应用程序提供了一个窗口 我想添加第二个窗口来显示程序首次加载的时间 所以基本上 会出现两个窗口 我在 Main storyboard 上放置了一个窗
  • 使用 ASIO 的线程池 - 线程退出,任务未执行

    我正在使用 Boost ASIO 用 C 编写一个 ThreadPool 类 以下是我迄今为止编写的代码 线程池类 using namespace std using namespace boost class ThreadPoolClas