处理pthread以便清理退出

时间:2011-04-22 08:06:11

标签: c pthreads posix

linux gcc c89

目前我有一个捕获和处理事件的事件循环。此事件循环将在其自己的主函数中创建的线程中运行。出于测试目的,我在这个循环中使用了一个usleep。

我有条件app_running来控制循环并退出循环。

但是,当我运行我的应用程序时,我不想退出main,因为这将终止应用程序。所以我有一个getchar()来等待输入,以表明我想终止应用程序。这会将app_running设置为false以退出事件循环。这看起来有点便宜。如果不使用getchar(),还有更好的方法吗?

非常感谢任何建议,

标题

#ifndef NETWORK_TASKS_H_INCLUDED
#define NETWORK_TASKS_H_INCLUDED

#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE (!FALSE)
#endif

int app_running;

void* process_events(void);

#endif /* NETWORK_TASKS_H_INCLUDED */

实行

#include <stdio.h>
#include <unistd.h>

#include "network_tasks.h"

void* process_events(void)
{
    app_running = TRUE;

    while(app_running) {
#define TIMEOUT 3000000
        /* This will be used for capturing events. use usleep for simulating testing */
        /* if(net_events(TIMEOUT) != 0) { */
        /*     process_network_event(); */
        /* } */
        /* Just for testing */
        usleep(TIMEOUT);
        printf("Sleeping.....\n");
    }

    printf("Finished sleeping....\n");

    return NULL;
}

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>

#include "network_tasks.h"

int main(void)
{
    pthread_t th_id = 0;
    int th_rc = 0;

    th_rc = pthread_create(&th_id, NULL, (void*)process_events, NULL);

    if(th_rc == -1) {
        fprintf(stderr, "Cannot create thread [ %s ]\n", strerror(errno));
        return -1;
    }

    getchar();
    app_running = FALSE;

    pthread_exit(NULL);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

如果你有一些其他机制来指示程序的结束,并且使用getchar()的唯一原因是阻止你不要结束程序,那么根本就不需要它。

你可以在main中使用pthread_join()进程线程。 Main将阻止该调用,直到进程线程结束。

或者,如果你还没有进一步的工作要做,你可以简单地pthread_exit()。与exit()不同,pthread_exit()不会杀死所有其他正在运行的线程。

另外,您已经错误地编写了pthread_create()的返回码检查。 Pthreads在错误约定上偏离标准unix返回码-1。成功时返回0,错误时返回正整数代码。

int main(void)
{
    pthread_t th_id;
    int th_rc;

    th_rc = pthread_create(&th_id, NULL, (void*)process_events, NULL);

    if(th_rc != 0) 
    {
        fprintf(stderr, "Cannot create thread [ %s ]\n", strerror(th_rc));
        return -1;
    }

    th_rc = pthread_join(th_id, NULL);

    return 0;
}

答案 1 :(得分:0)

这是做到这一点的方法。如果你不想阻止等待getchar()返回,你可以使用linux版本的kbhit():

http://pwilson.net/kbhit.html