我有一个无法使用 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/