Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;新手-提供它的pthread';将状态转换为另一个pthread 我是C++中的新手,在读一个非常基本的文件,然后处理数据的功能,我会一直坚持至少能提供一个线程的状态,这样数据就可以被消耗掉。这可能是我忽略的一些基本的东西——可以使用一些线索来使用C++中的pPult.< /P>_C++_Pthreads - Fatal编程技术网

c++;新手-提供它的pthread';将状态转换为另一个pthread 我是C++中的新手,在读一个非常基本的文件,然后处理数据的功能,我会一直坚持至少能提供一个线程的状态,这样数据就可以被消耗掉。这可能是我忽略的一些基本的东西——可以使用一些线索来使用C++中的pPult.< /P>

c++;新手-提供它的pthread';将状态转换为另一个pthread 我是C++中的新手,在读一个非常基本的文件,然后处理数据的功能,我会一直坚持至少能提供一个线程的状态,这样数据就可以被消耗掉。这可能是我忽略的一些基本的东西——可以使用一些线索来使用C++中的pPult.< /P>,c++,pthreads,C++,Pthreads,下面是一些基本的提取代码,功能正常,读取文件并提供要处理的数据。另一个处理数据的线程需要知道这个线程的状态。 最好的策略是什么?我试图通过一个函数从另一个线程请求线程的状态,但收到不正确的响应 Reader::Reader(){ _threadId = 1; _msg = NONE; // enum NONE, READ, STOP active = false; pthread_mutex_init(&_mutex, 0); } Reader::~

下面是一些基本的提取代码,功能正常,读取文件并提供要处理的数据。另一个处理数据的线程需要知道这个线程的状态。 最好的策略是什么?我试图通过一个函数从另一个线程请求线程的状态,但收到不正确的响应

Reader::Reader(){

    _threadId = 1; 
    _msg = NONE; // enum NONE, READ, STOP
    active = false;
    pthread_mutex_init(&_mutex, 0);
}

Reader::~Reader(){

    pthread_mutex_destroy(&_mutex);
}

void Reader::read(){

    _msg = READ;
    active = true;

    pthread_create(&_threadId, 0, work, this);
}

void * Reader::work(void *myselfreader){

    Reader * reader = (Reader*)myselfreader;

    reader->loop();

    pthread_exit(0);

    return 0;
}

void Reader::loop(){

    while(active){

            pthread_mutex_lock(&_mutex);

            switch(_msg){

                case READ:

                    // do the reading of the IO file - which works fine                 
                    // once done reading the file - the _msg is set to STOP

                    break;

                case STOP:

                    stopThread();

                    break;


                default:
                        break;
            }

            pthread_mutex_unlock(&_mutex);
        }

    return;
}

void Reader::stopThread(){

    active = false;

    _msg = ENC_NONE;

    pthread_join(_threadId, 0);
}

/*****************/

int Reader::getReaderState(){

    // another thread needs to know the state of this thread
    // 
    return _msg // ??
    return active // ??
}

似乎代码中的某个地方有种族条件

您需要使用互斥锁保护
\u msg
变量。每次需要更新
\u msg
变量请求互斥锁时,更新变量并关闭互斥锁。您需要对
getReaderState()
函数中的读取执行相同的操作-获取互斥体,将变量复制到temp中,释放互斥体并返回temp变量

为了方便且容易出错,您应该创建getter和setter函数来访问
\u msg
字段,该字段将由相同的互斥锁(而不是您已经使用的互斥锁)保护:


感谢Burgos-按照你的建议,它似乎没有什么不同-将尝试其他修复。
void setMsg(int msg)
{
    pthread_mutex_lock(&msg_mutex);
    _msg = msg;
    pthread_mutex_unlock(&msg_mutex);
}


int getMsg()
{
    int tmp;
    pthread_mutex_lock(&msg_mutex);
    tmp = _msg;
    pthread_mutex_unlock(&msg_mutex);
    return tmp;
}