c-处理pthread以清除出口



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;
}

如果你有其他机制来指示程序的结束,而你使用getchar((的唯一原因是阻止,这样你就不需要它了。

您可以在main中pthread_join((进程线程。Main将阻塞该调用,直到进程线程结束。

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

此外,您对pthread_create((的返回代码检查编码错误。Pthreads偏离了标准的unix返回代码-1 on error约定。成功时返回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;
}

就是这样做的。如果你不想阻止等待getchar((返回,你可以使用kbhit((的linux版本:

http://pwilson.net/kbhit.html

相关内容

  • 没有找到相关文章

最新更新