【发布时间】:2018-11-20 20:54:53
【问题描述】:
我有一个使用 std::shared_ptr 作为参数的 API 库。
我想将这些 API 与 pthread 一起使用。
我正在做的是:从 shared_ptr 获取原始指针,以便将其传递给 pthread。
从原始的 shared_ptr 创建一个新的 shared_ptr 并从另一个线程调用我的 API。
但是,将原始指针转换回共享指针时出现double free or corruption 错误。
这是我的代码
#include <memory>
#include <iostream>
#include <thread>
#include <pthread.h>
void* print_task(void* ptr)
{
int* val_raw = static_cast<int*>(ptr);
std::shared_ptr<int> val(val_raw);
// CALL MY API WHICH TAKES A SHARED_PTR AS ARGUMENT
std::cout<<"thread job done \n";
}
int main(int argc, char ** argv)
{
pthread_t thread;
std::shared_ptr<int> val = std::make_shared<int>(10);
pthread_create(&thread, nullptr, &print_task, static_cast<void *>(val.get()));
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
我想我在从共享指针到原始指针的所有转换中都做错了,因为使用 std::threads(我可以直接传递 shared_ptr)的相同代码可以工作。 但是我需要设置线程优先级,因此我尝试使用 pthreads 来做到这一点。
您知道如何更改我的代码以便能够传递共享指针并在 pthread 中使用它吗?
【问题讨论】:
-
为什么不使用 C++ 线程?上次我查看时,他们公开了底层线程句柄,只是为了您需要做一些通用 API 不支持的特殊操作。
-
为什么不直接传递一个指向 std::shared_ptr 的指针,然后在线程内复制构造另一个?
-
问题可以简化为“如何通过 void 指针传递 shared_ptr?”线程是红鲱鱼,部分。
-
"将原始指针转换回共享指针时。" - 你不能那样做。你最终会得到两个单独的 shared_ptr——每个都有自己的引用计数,每个都为 0 并尝试删除对象。
-
为什么要在
main中创建shared_ptr?您没有将shared_ptr传递给线程,并且您不想在main中管理对象的生命周期。
标签: c++ pthreads shared-ptr