реклама на сайте
подробности

 
 
> Какой аналог у SetEvent в pthread?
Andrey_Sudnov
сообщение May 13 2008, 08:21
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 15-03-05
Пользователь №: 3 361



Проблема в том, что в библиотеке PThread нет работы с файловыми дескрипторами. Соответственно, для того чтобы одновременно ожидать завершения какой-либо файловой (или сокетовой) операции или поступления управляющего сигнала от другого потока (например, об отмене операции), приходится использовать неименнованные каналы (pipe и write, вместо SetEvent) и функцию poll (предпочитаю ее, а не select). Перерыл кучу книг, в том числе POSIX стандарт, ничего лучше не придумал. Насколько такое решение накладно по ресурсам? Как организовать такое взаимодействие потоков другим способом?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
RCray
сообщение May 15 2008, 10:08
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 14-09-05
Из: Suwon
Пользователь №: 8 548



только у меня так:

Код
void* child_func(void* arg)
{
    struct args_t* args = (args*)arg;
    
    args->size = read(args->fd, args->packet, args->supposed_size);
    args->event.flag = 1;
    pthread_cond_signal(&args->event.event);

    return 0;
}

int parent(struct args_t *args)
{
    pthread_t        child;
    struct timespec    tm;

    if ( pthread_create(&child, NULL, child_func, args) != 0 )
        return ERR_CREATE;

    // задание таймаута
    ...

    while(!args->event.flag)
    {
        res = pthread_cond_timedwait(&args->event.event, &args->event.lock, &tm);
        if (res == ETIMEDOUT)
            return ERR_TIMEOUT;
    }

    args->event.flag = 0;
    return args->errors;
}
Go to the top of the page
 
+Quote Post
KRS
сообщение May 15 2008, 12:16
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Без mutex есть потенциальные проблемы:
если между проверкой и очисткой возникнет еще одно событие вы его потеряете потому что обнулите args->event.flag = 0;

Цитата(2b|!2b?.. @ May 15 2008, 14:08) *
Код
    while(!args->event.flag)
    {
        res = pthread_cond_timedwait(&args->event.event, &args->event.lock, &tm);
        if (res == ETIMEDOUT)
            return ERR_TIMEOUT;
    }

    args->event.flag = 0;
    return args->errors;
}
Go to the top of the page
 
+Quote Post
RCray
сообщение May 15 2008, 12:44
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 170
Регистрация: 14-09-05
Из: Suwon
Пользователь №: 8 548



Цитата(KRS @ May 15 2008, 16:16) *
Без mutex есть потенциальные проблемы:
если между проверкой и очисткой возникнет еще одно событие вы его потеряете потому что обнулите args->event.flag = 0;


да, опять вы правы.
к тому же не лишним будет это
Код
res = pthread_cond_timedwait(&args->event.event, &args->event.lock, &tm);
        if (res == ETIMEDOUT)
        {
            pthread_cancel(созданный ранее поток, от которого ожидается сигнал);
            return ERR_TIMEOUT;
        }
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016