обработка резьбы для чистого выхода - PullRequest
0 голосов
/ 22 апреля 2011

linux gcc c89

В настоящее время у меня есть цикл обработки событий, который будет захватывать и обрабатывать события.Этот цикл обработки событий будет выполняться в своем собственном потоке, созданном из основной функции.В целях тестирования я использую usleep в этом цикле.

У меня есть условие app_running для управления циклом и выхода из цикла.

Однако, когда я запускаю свое приложение, я не хочувыйти из главного, потому что это приведет к завершению приложения.Поэтому у меня есть метод 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;
}

main

#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 ]

3 голосов
/ 23 апреля 2011

Если у вас есть какой-то другой механизм для указания конца программы, и единственная причина, по которой вы используете getchar (), - это блокировка, чтобы не завершать программу, тогда она вам вообще не нужна.

Вы можете pthread_join () обработать поток в main. 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;
}
0 голосов
/ 22 апреля 2011

Это способ сделать это.Если вы не хотите блокировать ожидание возврата getchar (), вы можете использовать Linux-версию kbhit ():

http://pwilson.net/kbhit.html

...