C 正在处理pthread以清除退出

C 正在处理pthread以清除退出,c,pthreads,posix,C,Pthreads,Posix,linux gcc c89 目前,我有一个事件循环,它将捕获和处理事件。此事件循环将在从主函数创建的自己的线程中运行。出于测试目的,我在这个循环中使用了usleep 我有一个条件app_运行来控制循环并退出循环 但是,当我运行应用程序时,我不想退出main,因为这将终止应用程序。因此,我有一个put a getchar()等待输入,以指示我要终止应用程序。这将设置app_running为false以退出事件循环。这一切看起来都有点便宜。有没有更好的方法不用getchar()来实现这一点 非常感谢

linux gcc c89

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

我有一个条件app_运行来控制循环并退出循环

但是,当我运行应用程序时,我不想退出main,因为这将终止应用程序。因此,我有一个put a 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;
}
#包括
#包括
#包括“网络任务.h”
作废*处理事件(作废)
{
app_running=TRUE;
当(应用程序运行时){
#定义超时3000000
/*这将用于捕获事件。使用usleep进行模拟测试*/
/*如果(网络事件(超时)!=0){*/
/*处理网络事件()*/
/* } */
/*只是为了测试*/
usleep(超时);
printf(“睡眠…\n”);
}
printf(“已完成睡眠…”\n);
返回NULL;
}
主要

#包括
#包括
#包括
#包括
#包括“网络任务.h”
内部主(空)
{
pthread_t th_id=0;
int th_rc=0;
th_rc=pthread_create(&th_id,NULL,(void*)进程事件,NULL);
如果(th_rc==-1){
fprintf(stderr,“无法创建线程[%s]\n”,strerror(errno));
返回-1;
}
getchar();
app_running=FALSE;
pthread_exit(NULL);
返回0;
}

这就是方法。如果您不想阻止等待getchar()返回,那么可以使用kbhit()的linux版本:


这就是方法。如果您不想阻止等待getchar()返回,那么可以使用kbhit()的linux版本:


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

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

或者,如果您在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;
}

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

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

或者,如果您在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;
}