将shared_ptr或unique_ptr传递给_beginthreadex

时间:2014-09-17 22:09:10

标签: c++ c++11 shared-ptr smart-pointers unique-ptr

我想知道这是可能的。创建一个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 *“存在”

2 个答案:

答案 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::getunique_ptr::get访问指向托管对象的指针。

shared_ptr<TestClass> p = make_shared<TestClass>(count, "test");
HANDLE hth1 = (HANDLE)_beginthreadex(NULL, 0, p->ThreadStart, p.get(), 0, NULL);