1

我在 Linux 下用 C++ 编写了一个程序。对于线程,我使用的是 pthread。在程序中,我启动线程并且该线程一直在运行,直到我调用该函数,这应该停止它。在这里你可以看到我的代码。

bool isRunning = false;
pthread_t thread;

void startThread() {
    isRunning = true;
    int thread_return = pthread_create(&thread, NULL, runThread, NULL);
}

bool stopThread() {
    isRunning = false;
    // wait until the thread will be finished
    return true;
}

void* runThread(void* ptr) {
    while(isRunning) {
        // do smth.
    }
    pthread_exit(NULL);
}

当线程启动时,它会做某事。直到isRunningwill的值false和主程序本身将做其他事情。问题是,当我调用函数时stopThread,这个函数只是设置isRunning为 false,而不是等到线程在 while 循环内完成它的任务。我的问题是,我怎么能说 function stopThread,它应该等待线程退出。

我设置为pthread_join. _ 但有时它会导致问题,即程序无限等待。因为线程完成的速度比程序来等待线程快。因为线程可以在while循环内的不同部分。所以我永远不知道线程需要退出多少。stopThreadisRunningfalse

谢谢

4

3 回答 3

2

根据我对您问题的理解,您应该使用线程连接的概念。

像这样,

bool stopThread() {
    int returnCode;
    isRunning = false;
    void *status;
    rc = pthread_join(your_thread, &status);

    // wait until the thread will be finished

    if (rc) {
        printf("ERROR; return code from pthread_join() 
                is %d\n", rc);
        exit(-1);
    }
    printf("Main: completed join with thread %ld having a status   
            of %ld\n",t,(long)status);

    return true;
}
于 2011-07-12T18:24:32.197 回答
1

看功能pthread_joinpthread_join 的单个 UNIX 规范文档。

您需要跟踪线程 ID,才能使用此功能。一个常见的范例似乎是有一个Thread封装了该信息的类。

于 2011-07-12T18:21:27.287 回答
1

在这种情况下,您应该可以对其进行操作pthread_join(),但是如果由于某种原因不起作用,您可以尝试添加一个hasFinished变量(然后在hasFinished == true关闭线程的任何地方等待...)

bool isRunning = false;
pthread_t thread;

// TODO FIX: this is a workaround due to pthread_join() not working properly
bool hasFinished = false

void startThread() {
    isRunning = true;
    int thread_return = pthread_create(&thread, NULL, runThread, NULL);
}

bool stopThread() {
    isRunning = false;
    // wait until the thread will be finished
    return true;
}

void* runThread(void* ptr) {
    while(isRunning) {
        // do smth.
    }

    // TODO FIX: this is a workaround because pthread_join() is not working properly
    hasFinished = true;
    pthread_exit(NULL);

}

[编辑澄清:]

无论你在哪里停止线程

/**/
// TODO FIX: this following is a workaround due to pthread_join() not working
isRunning = false;

int TimeoutSleep_ms = 100;
// TimeoutSleep_ms * TimeoutCounter is the timeout time, 10 sec for this case
int TimeoutCounter = 100; 

while (!hasFinished && (--TimeoutCounter > 0))
    sleep(100);
// END TODO FIX
/**/
于 2011-07-12T18:25:34.973 回答