C++ 将数据传递给新的pthread

C++ 将数据传递给新的pthread,c++,thread-safety,pthreads,deque,C++,Thread Safety,Pthreads,Deque,我在pthread中有一个代码块(让我们调用这个线程a),我希望生成一个新的pthread(让我们调用这个线程b)。线程b需要传递一个deque,我有以下代码: void* process_thread_b(void* arg) { deque<string> *ptr = (deque<string>*)arg; cout << "Size -" << ptr->size() << endl;

我在pthread中有一个代码块(让我们调用这个线程
a
),我希望生成一个新的pthread(让我们调用这个线程
b
)。线程
b
需要传递一个deque,我有以下代码:

void* process_thread_b(void* arg)
{              
  deque<string> *ptr = (deque<string>*)arg;
  cout << "Size -" << ptr->size() << endl;

  deque<string>::iterator it;
  for(it = ptr->begin(); it != ptr->end(); it++)
  {
    cout <<(*it) << endl;
  }
}
在生成pthread时,我使用以下代码

 deque<string> myDeque;

 // Add strings to deque here...

 pthread_t dispatchCommands;
 pthread_create(&dispatchCommands, NULL, &process_thread_b, (void*)&myDeque);
deque myDeque;
//在此处向deque添加字符串。。。
pthread_t dispatch命令;
pthread_create(&dispatchCommands,NULL,&process_thread_b,(void*)&myDeque);

底部代码发生在线程
a
中。为什么当我试图打印出一个deque元素时,我得到了一个错误,但我可以得到它的大小?

我认为这是因为您试图将对deque的引用转换为一个空白*,请尝试以下操作:

 deque<string> * myDeque = new deque<string>();

希望这有帮助。

pthread\u create
将在线程函数开始执行之前很久返回。您的
deque
将在很久以前被销毁。您需要在堆上创建它。

或者确保主机没有退出当前作用域(或者deque位于线程终止前未退出的作用域中)。(两者都是更常见的解决方案)。当您需要将对象传递给将“拥有”该对象的线程时,使用的一个好习惯用法是使用
new
分配该对象,将指向该对象的指针传递给线程的start函数,并在完成后让线程
删除该对象。您可以让线程的start函数完成所有工作,如下所示:
void*MyThreadFunction(void*foo){reinterpret\u cast(foo);foo->RealWorkFunction();delete foo;return NULL;}
编写多线程应用程序时使用的一个好习惯用法是动态分配所有内容。遗憾的是,无论是在这个网站上还是在网上,都有很多不合格的“总是在堆栈上分配,不要使用new()”建议。开发人员遵循此建议,最终导致启动崩溃(如OP)、线程试图访问crt已破坏的静态对象时出现关机问题,以及其间出现的各种问题。@MartinJames:这是非常错误的。不使用
new
并不意味着“不动态分配”,而是意味着“不要让自己暴露在原始
new
的可怕异常和内存不安全中”,这是两件完全不同的事情。
 deque<string> * myDeque = new deque<string>();
 (void*)myDeque