C++ C+的含义+/pthread/join错误消息";what():无效参数";

C++ C+的含义+/pthread/join错误消息";what():无效参数";,c++,pthreads,C++,Pthreads,它是一个更大应用程序的一部分,是一个简单的计时器线程,在尝试完成它之前可以正常工作: boost::asio::io_service io_service; shared_ptr<thread> loop; // it is not initialised here, just shows the idea boost::asio::deadline_timer timer(io_service, interval); void Timer::spin() { loop =

它是一个更大应用程序的一部分,是一个简单的计时器线程,在尝试完成它之前可以正常工作:

boost::asio::io_service io_service;
shared_ptr<thread> loop;
// it is not initialised here, just shows the idea
boost::asio::deadline_timer timer(io_service, interval);

void Timer::spin() {
    loop = make_shared<thread>(&Timer::run, this);
}
void Timer::unspin() {
    io_service.stop();
    loop.get()->join();
}
void run() {
   timer.async_wait(bind(&Timer::callbackWrapper, this, _1));
   // restart
   io_service.run();    
}
<如果我“解密”它,意思是“当其他线程仍然在运行时主线程完成”(我不知道C++ LINGO)< /P> 如果依次调用
unspin()
,则可能会显示以下零星错误消息:

terminate called after throwing an instance of 'std::system_error'
  what():  Invalid argument

这很可能是由
thread.join()
引发的。问题是,我搜索了Stackexchange,但无法解释另一条消息。我意识到问题可能不在代码的小片段范围内(应用程序相当大,所以我不包括它)。但即使是这样,我也会询问第二条错误消息的含义及其可能的原因。

引发
std::system_error
(使用
EINVAL
,如此处所示,或使用其他值)的可能原因有很多

你可以:

  • 在cppreference.com上搜索
    std::system\u error
    的实例,或
  • 指示您的调试器在抛出时中断,这样您就可以确切地看到引发异常的原因——然后转到文档,了解它抛出异常的原因
  • 这些消息本身并不神秘,它们只是间接地依赖于整个C++生态系统的工作方式。它是否可以被设计为调用某个特定的“终止”函数,该函数仅为您忘记加入线程的情况保留?当然

    但这将是非常笨拙的,因为它会增大运行时模块的大小,而实际上并没有任何好处。当您编写更多的代码时,您将获得经验,并开始记忆或“感觉”什么样的事情会导致什么样的问题。关于多线程代码中的
    std::system\u error
    std::terminate
    的任何内容几乎肯定与所述线程的不当处理有关。过一会儿你就会知道了

    在这种情况下,您可以记住以下两种解释:

    在没有活动异常的情况下终止调用

    直接调用
    std::terminate
    。同样,您可以在库文档中搜索这种说法,并找出与代码相关的可能原因

    在抛出“std::system_error”实例后调用terminate


    ,但在捕获它的程序中没有
    try
    /
    catch
    ,因此异常系统调用了
    std::terminate
    。同样,您可以研究您使用的特征可以抛出<代码> STD::SytSyrase,并且考虑在您的代码时添加一些异常安全性。

    < P>可能发生的东西导致代码< > STD::StulyOrthRebug < /C> >(<代码> Envale<代码>,如这里或其他值)众多。

    你可以:

  • 在cppreference.com上搜索
    std::system\u error
    的实例,或
  • 指示您的调试器在抛出时中断,这样您就可以确切地看到引发异常的原因——然后转到文档,了解它抛出异常的原因
  • 这些消息本身并不神秘,它们只是间接地依赖于整个C++生态系统的工作方式。它是否可以被设计为调用某个特定的“终止”函数,该函数仅为您忘记加入线程的情况保留?当然

    但这将是非常笨拙的,因为它会增大运行时模块的大小,而实际上并没有任何好处。当您编写更多的代码时,您将获得经验,并开始记忆或“感觉”什么样的事情会导致什么样的问题。关于多线程代码中的
    std::system\u error
    std::terminate
    的任何内容几乎肯定与所述线程的不当处理有关。过一会儿你就会知道了

    在这种情况下,您可以记住以下两种解释:

    在没有活动异常的情况下终止调用

    直接调用
    std::terminate
    。同样,您可以在库文档中搜索这种说法,并找出与代码相关的可能原因

    在抛出“std::system_error”实例后调用terminate


    ,但在捕获它的程序中没有
    try
    /
    catch
    ,因此异常系统调用了
    std::terminate
    。同样,您可以研究您使用的特征可以抛出<代码> STD::StulySyrase,并且还考虑在您的代码时添加一些异常安全性。

    < P>此代码,在其当前形式中,不能合理地调试。这是因为它具有代码未检测到的接口规则(例如不连续两次调用
    spin
    )。这使得代码很难测试、调试和维护

    它甚至会使代码难以理解,因为这些需求可能没有在代码或文本中的任何地方记录下来。未来:

  • 让您的代码检测到这些违反其接口要求的行为,以便您可以轻松地找到并修复它们。这很容易。
    unpin
    功能可以
    reset
    shared\u ptr。
    spin
    功能可以检查
    shared_ptr
    是否已解锁

  • 进行单元测试,测试所有正确和不正确的接口访问,这样您就可以自行调试此代码,并确保对不正确访问模式的检测工作正常。其中一个单元测试应该连续调用两次
    spin
    ,并确保返回正确的错误或抛出正确的异常。这也可以作为代码来记录什么将和什么将不与类的接口一起工作

  • 如果您遇到无法修复的问题,那么代码和单元测试就可以独立显示问题,您将确切知道代码的哪些方面失败。

  • terminate called after throwing an instance of 'std::system_error' what(): Invalid argument