c++ - 为什么TinyThread++这里不调用线程函数

标签 c++ multithreading

我有一个无法使用 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 共享在线链接,因为它是多个文件。

最佳答案

在这一行之后

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

尝试调用

t3();

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

您已经声明了不接受任何参数并返回 my_thread 对象的函数。如果你想创建 my_thread 的实例,写:

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

关于c++ - 为什么TinyThread++这里不调用线程函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52403809/

相关文章:

multithreading - 在多线程环境中锁定什么和不锁定什么(信号量和共享内存)

c++ - 如何从另一张 map 构建一张 map ?

c++ - 独立使用 Fortran 77 子程序,从 C++ 调用

c++ - 我可以根据某些计算结果定义类型吗?

java - 来自 java.util.concurrent 的线程

C# 停止 TCP 文件传输

c++ - 基于CLRS的合并排序C++上的算法简介(带反转计数)

C++ 将内存页面大小从 4096 字节减少

multithreading - .NET 线程面试问题

c# - 如何证明多线程在工作?