1

我是 C++ 的新手,正在研究应该是一个非常基本的文件读取然后处理数据功能,我一直坚持能够至少向另一个线程提供“状态”,以便可以使用数据。这可能只是我忽略的一些非常基本的东西 - 可以使用一些洞察力来了解在 c++ 中使用 pthreads。

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

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 // ??
}
4

1 回答 1

0

您的代码中似乎有竞争条件。

您需要_msg使用互斥锁保护您的变量。每次需要更新_msg变量请求互斥体时,更新变量并关闭互斥体。您需要为读取getReaderState()函数做同样的事情 - 获取互斥锁,将变量复制到 temp,释放互斥锁并返回 temp 变量。

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

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;
}
于 2012-12-12T01:37:07.673 回答