我想将int变量传递给线程。
我的线程代码:
void record_WAVthread(void* data)
{
int channelId = *(int*)data;
cout<< "\n THREAD CREATED " << channelId;
(...)
_endthread();
}我的线程创建代码:
extern HANDLE thread_audio_recording[MAX_INPUTS];
extern void record_WAVthread(void* data);
(...)
case 's':
if (!flag_recordingAudio)
{
//start recording
audioRecManager.isRecording = flag_recordingAudio = true;
for (int i = 0; i < 16; i++)
{
thread_audio_recording[i] = (HANDLE)_beginthread(record_WAVthread, 0, &i);
}
}
break;输出:
THREAD CREATED 0
THREAD CREATED 5
THREAD CREATED 5
THREAD CREATED 9
THREAD CREATED 14
THREAD CREATED 15
THREAD CREATED 12
THREAD CREATED 11
THREAD CREATED 9
THREAD CREATED 12
THREAD CREATED 8
THREAD CREATED 7
THREAD CREATED 4
THREAD CREATED 2
THREAD CREATED 3
THREAD CREATED 6我做错了什么?我应该得到1-16。
发布于 2015-02-16 07:18:44
您将堆栈变量的地址作为参数使用到线程函数,这是Windows多线程编程中常见的错误。
&i指向一个临时堆栈变量,该变量不能将其值保留在其作用域之外。这可能是案件之后的任何价值。您需要使用堆变量作为线程函数的参数。
但是对于您的代码,这里有一个简单的解决方案。
case 's':
if (!flag_recordingAudio)
{
//start recording
audioRecManager.isRecording = flag_recordingAudio = true;
for (int i = 0; i < 16; i++)
{
thread_audio_recording[i] = (HANDLE)_beginthread(record_WAVthread, 0, (void*)i);
}
}
break;
void record_WAVthread(void* data)
{
int channelId = (int)data;
cout<< "\n THREAD CREATED " << channelId;
(...)
_endthread();
}发布于 2015-02-16 07:15:47
您正在传递一个指向“i”的指针,其中的值一直在变化。当它启动第一个线程时,'i‘可能已经改变了(从您的输出来看,它已经被第二个线程创建了),并且您的线程不会产生您期望的输出。
如果要正确地执行此操作,请创建大小为16的int数组,填充0、1、2、.并传递一个指向由'i‘(即&arri)索引的数组元素的指针。
另一种解决方案是欺骗编译器,而不是传递指针,而是将'i‘本身传递给一个空指针。当然,在线程中,您不会取消对它的引用,而只是简单地将其转换回int。
发布于 2015-02-16 07:21:28
您需要线程回调函数中的互斥对象。
std::mutex g_mutex;
void record_WAVthread(void* data)
{
g_mutex.lock();
int channelId = *(int*)data;
cout<< "\n THREAD CREATED " << channelId;
g_mutex.unlock();
(...)
_endthread();
}https://stackoverflow.com/questions/28536172
复制相似问题