gpt4 book ai didi

c++ - 在 _beginthread 中接收到错误数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:35 24 4
gpt4 key购买 nike

我想将 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。

最佳答案

您将堆栈变量的地址用作线程函数的参数,这是 Windows 多线程编程中的常见错误。

&i 指向一个临时堆栈变量,该变量无法将其值保留在其范围之外。它可以是 case 之后的任何值。您需要使用堆变量作为线程函数的参数。

但对于您的代码,这里有一个特别简单的解决方案。

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();
}

关于c++ - 在 _beginthread 中接收到错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28536172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com