C++ 在_beginthread中接收错误数据

C++ 在_beginthread中接收错误数据,c++,c,multithreading,C++,C,Multithreading,我想把int变量传递给线程 我的线程代码: void record_WAVthread(void* data) { int channelId = *(int*)data; cout<< "\n THREAD CREATED " << channelId; (...) _endthread(); } 我做错了什么?我应该得到1-16。您正在传递一个指向“I”的指针,其值不断变化。当它启动第一个线程时,“i”可能已经发生了变化(从您的输

我想把int变量传递给线程

我的线程代码:

void record_WAVthread(void* data)
{
    int channelId = *(int*)data;
    cout<< "\n THREAD CREATED " << channelId;

    (...)

    _endthread();
}

我做错了什么?我应该得到1-16。

您正在传递一个指向“I”的指针,其值不断变化。当它启动第一个线程时,“i”可能已经发生了变化(从您的输出判断,在第二个线程创建时它已经发生了变化),并且您的线程将不会产生您期望的输出

如果您想正确地执行此操作,请创建一个大小为16的int数组,用0、1、2、,。。并传递一个指向由“i”(即&arr[i])索引的数组元素的指针


另一种解决方案是愚弄编译器,不传递指针,而是传递“i”本身,将其转换为空指针。当然,在线程中,您不会取消对它的引用,而只是将它转换回int。

您将堆栈变量的地址用作线程函数的参数,这是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();
}
case's':
如果(!flag_recordingAudio)
{   
//开始录音
audioRecManager.isRecording=flag\u recordingAudio=true;
对于(int i=0;i<16;i++)
{
线程\u音频\u录制[i]=(句柄)\u开始线程(录制\u WAVthread,0,(void*)i);
}
}
打破
无效记录(无效*数据)
{
int channelId=(int)数据;

cout在线程回调函数中需要一个互斥体

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();
}
std::mutex g_mutex;
无效记录(无效*数据)
{
g_mutex.lock();
int channelId=*(int*)数据;

couti从0到15。为什么要得到1-16?还有,为什么要将指向i的指针传递到beginthread?为什么不直接传递i?为True 0-15是我的错误。在进行这些更改后,我会得到相同的错误。Strange@F1sher:值中应该没有错误。但是数字的顺序可能会更改,因为线程0~15的执行顺序是uncert是的。你说得对。我没有注意到。谢谢你发布工作编辑代码。
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();
}
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();
}