我想知道这是可能的。创建一个testClass类型的shared_ptr或unique_ptr。
然后调用_beginthreadex并将类的静态方法作为要执行的函数和之前创建的shared_ptr或unique_ptr作为数据传递给它。像这样:
shared_ptr<TestClass> p = make_shared<TestClass>(count, "test");
HANDLE hth1 = (HANDLE)_beginthreadex(NULL, 0, p->ThreadStart,p, 0, NULL);
我通常在没有智能指针的情况下使用这种方法,我通常创建一个TestClass的普通指针,并将TestClass的静态方法和指针本身作为数据传递,然后在静态方法中将其转换为(TestClass *)并运行类等的成员方法,做工作,当线程完成时我删除指针。像这样:
TestClass * p = new TestClass(count, "test");
HANDLE hth1 = (HANDLE)_beginthreadex(NULL, 0, p->ThreadStart,p, 0, NULL);
我想要实现的是使智能指针在线程结束时自动删除对象,因为智能指针超出了范围。
当我这样做时,我在编译器上面描述的方式显示了这个错误:
“没有合适的转换函数从”std :: shared_ptr“到”void *“存在”
答案 0 :(得分:2)
_beginthreadex
看起来像c函数,为了达到你想要的效果,你需要在{{1}的情况下调用复制构造函数(或移动转移所有权,这在c。
您可以考虑使用std::thread
类与std套件的其余部分配合使用。
假设您要运行:
unique_ptr
你可以通过
解雇void ThreadStart(std::shared_ptr<TestClass> p);
如果void ThreadStart(std::shared_ptr<TestClass> p)
{
cout << p->count << " " << p->name << endl;
}
int main()
{
shared_ptr<TestClass> p = make_shared<TestClass>(33, "test");
std::thread thr(ThreadStart, p);
thr.join();
}
你需要std::unique_ptr
它到线程函数,那么它将在线程结束时被删除:
std::move
答案 1 :(得分:0)
使用shared_ptr::get
或unique_ptr::get
访问指向托管对象的指针。
shared_ptr<TestClass> p = make_shared<TestClass>(count, "test");
HANDLE hth1 = (HANDLE)_beginthreadex(NULL, 0, p->ThreadStart, p.get(), 0, NULL);