首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在_beginthread中接收错误数据

在_beginthread中接收错误数据
EN

Stack Overflow用户
提问于 2015-02-16 07:09:21
回答 3查看 76关注 0票数 0

我想将int变量传递给线程。

我的线程代码:

代码语言:javascript
复制
void record_WAVthread(void* data)
{
    int channelId = *(int*)data;
    cout<< "\n THREAD CREATED " << channelId;

    (...)

    _endthread();
}

我的线程创建代码:

代码语言:javascript
复制
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;

输出:

代码语言:javascript
复制
 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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-16 07:18:44

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

&i指向一个临时堆栈变量,该变量不能将其值保留在其作用域之外。这可能是案件之后的任何价值。您需要使用堆变量作为线程函数的参数。

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

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2015-02-16 07:15:47

您正在传递一个指向“i”的指针,其中的值一直在变化。当它启动第一个线程时,'i‘可能已经改变了(从您的输出来看,它已经被第二个线程创建了),并且您的线程不会产生您期望的输出。

如果要正确地执行此操作,请创建大小为16的int数组,填充0、1、2、.并传递一个指向由'i‘(即&arri)索引的数组元素的指针。

另一种解决方案是欺骗编译器,而不是传递指针,而是将'i‘本身传递给一个空指针。当然,在线程中,您不会取消对它的引用,而只是简单地将其转换回int。

票数 0
EN

Stack Overflow用户

发布于 2015-02-16 07:21:28

您需要线程回调函数中的互斥对象。

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28536172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档