【发布时间】:2018-09-01 14:09:51
【问题描述】:
我需要将多个值传递给一个新线程(使用_beginthreadex 函数创建)。我为此创建了一个结构。
struct CaptureThreadInput {
std::mutex* eventMutex;
std::condition_variable* eventCv;
std::vector<DispatchEvent>* eventVector;
int capId, width, height;
};
我在主线程中使用 Dispatch 对象的私有函数启动了一个新线程。
void Dispatch::startCaptureThread(int i) {
CaptureThreadInput params = {
&eventMutex,
&eventCv,
&eventVector,
i, 1280, 720
};
CaptureThreadInput* data = ¶ms;
cout << "Address from dispatch " << std::addressof(*data) << "\n";
cout << "Mutex from dispatcher " << std::addressof(*(data->eventMutex)) << "\n";
cout << "CapId from dispatcher " << data->capId << "\n";
cout << "Width from dispatcher " << data->width << "\n";
_beginthreadex(NULL, 0, &(CaptureThread::initThread), ¶ms, 0, 0);
}
在启动的线程中,我只是调试输出。 CaptureThread::initThread 是一个公共静态函数。
unsigned int __stdcall CaptureThread::initThread(void* in) {
CaptureThreadInput* data = (CaptureThreadInput*)in;
cout << "Address from thrd " << std::addressof(*data) << "\n";
cout << "Mutex from thread " << std::addressof(*(data->eventMutex)) << "\n";
cout << "CapId from thread " << data->capId << "\n";
cout << "Width from thread " << data->width << "\n";
return 0;
}
但是,我从 Dispatch::startCaptureThread 和新创建的线程中创建的结构中获得了不同的值。 Struct 在两个线程中的每一个中返回不同的地址。控制台输出:
Address from dispatch 0000001A83EFF568
Mutex from dispatcher 0000001A83EFFD10
CapId from dispatcher 0
Width from dispatcher 1280
Address from thrd 0000001A83EFF568
Mutex from thread CCCCCCCCCCCCCCCC
CapId from thread -858993460
Width from thread -858993460
我还尝试注释掉 eventMutex、eventCv 和 eventVector,只在结构中留下整数,结果相同。
知道是什么原因造成的吗?如何更改我的代码来修复它?
使用 Microsoft Visual Studio for Windows x64 平台进行开发。
【问题讨论】:
-
为什么不使用 C++ 标准线程?
-
你能帮我做一个测试吗?您可以将创建的
struct存储到成员变量中,然后使用它传递给_beginthreadex,而不是在本地创建CaptureThreadInput。您正在本地创建CaptureThreadInput,然后将引用传递给_beginthreadex,它会立即返回。此时您的startCaptureThread退出,导致params超出范围。要么防止params超出范围,要么按值传递params -
你真的很幸运,你得到了不同的值,而不是意外地相同的值,这会隐藏你的问题。
标签: c++ multithreading struct