c++ - 为什么在 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 共享在线链接,因为东西是多个文件。
解决方案
在这条线之后
chops::my_thread<chops::log> t3();
尝试调用
t3();
你会得到function t3 is undefined
-繁荣,惊喜。
您已经声明了不带任何参数并返回my_thread
对象的函数。如果要创建 my_thread 的实例,请编写:
chops::my_thread<chops::log> t3;
推荐阅读
- c# - Visual Studio 2017 详细发布
- loops - Lisp - 标志(班德拉)不起作用
- pdf - 如何恢复损坏的pdf
- signalr - 使用 Aspnetcore.signalr libray 从集线器外部获取 HubContext(不是来自控制器)
- c++ - 复杂的多重继承情况
- javascript - 如何在javascript中显示“未找到匹配项”
- docker - 当jenkins在docker容器中时如何在docker容器上运行构建
- ios - 如果我的数组中有数据,空的 tableview 标签会闪烁一秒钟
- vba - 无法在 PPT2016 (MAC OS) 中使用 VBA 删除超链接
- google-maps - cakephp3 中 google api 中的错误消息