首页 > 解决方案 > 为什么在 TinyThread++ 中不调用线程函数

问题描述

我有一个程序不能使用 C++11,我使用 TinyThread++ 来支持线程,因为它尽可能地遵循标准 C++ API。我从我的程序中提取了一个最小的工作示例,但我不确定我是否准确地捕捉到了这个问题。没关系,代码如下:

namespace chops {
    template <typename Fun>
    struct my_thread_par {
        Fun f;
    };

    template <typename Fun>
    void my_call(void* args) {
        std::cout << "here2\n";
        my_thread_par<Fun> *par = (my_thread_par<Fun>*) args;
        par->f();
    }


    template <typename Fun>
    struct my_thread {
        my_thread() {
            std::cout << "here1\n";
            Fun f;
            my_thread_par<Fun> par;
            par.f = f;
            tthread::thread t(my_call<Fun>, (void *) &par);
            t.join();
        }
    };

    struct log {
        void operator()() {
            std::cout << "log\n";
        }
    };
}

int main() {
    chops::my_thread<chops::log> t3();
} 

在 TinyThread++ 中,您需要将线程参数打包成一个类似结构的东西并将其作为 传递void *,就像在 pthread API 中一样。在这个最小的例子中,std::cout << "here2\n";没有调用该行,我认为这是由于没有调用线程函数。这很奇怪,因为我正在等待线程加入。事实上,调试打印here1也没有打印,这意味着my_thread构造函数也没有被调用。

在我的实际程序中,如果我等待他们加入,我可以看到线程运行得很好,但如果我这样做t.detach()而不是加入,它也不会打印任何东西。因此,考虑到所有这些,并通过最小的示例,当我等待加入但分离时甚至无法进入线程函数时,什么可以导致线程正常工作?

注意:TinyThread++ 是一个小型库,您可以自己使用示例。我无法与 wandbox 共享在线链接,因为东西是多个文件。

标签: c++multithreading

解决方案


在这条线之后

chops::my_thread<chops::log> t3();

尝试调用

t3();

你会得到function t3 is undefined-繁荣,惊喜。

您已经声明了不带任何参数并返回my_thread对象的函数。如果要创建 my_thread 的实例,请编写:

chops::my_thread<chops::log> t3;

推荐阅读