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

 
 
> Какой аналог у 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
Ответов
KRS
сообщение May 14 2008, 08:23
Сообщение #2


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

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



в POSIX есть mutex и Condition Variables
я когда игрался с POSIX под сигвин делал примерно так:
Код
typedef struct {
    pthread_mutex_t lock;
    pthread_cond_t event;
    bool flag;
}event_t;

static inline void event_init(event_t* event)
{
    pthread_mutex_init(&event->lock,0);
    pthread_cond_init(&event->event,0);
    event->flag=false;
}

static inline void event_set(event_t* event)
{
    pthread_mutex_lock(&event->lock);
    if (!event->flag) {
        event->flag=true;
        pthread_cond_signal(&event->event);
    }
    pthread_mutex_unlock(&event->lock);
}

static inline bool event_wait(event_t* event, unsigned s_timeout)
{
    bool r;
    pthread_mutex_lock(&event->lock);
    if(!event->flag) {
        if (s_timeout) {
            timespec_t timer;
            clock_gettime(CLOCK_REALTIME,&timer);
            timer.tv_sec+=s_timeout;
            pthread_cond_timedwait(&event->event,&event->lock,&timer);
        }else {
            do {
                pthread_cond_wait(&event->event,&event->lock);
            }while(!event->flag);
        }
    }
    r=event->flag;
    event->flag=false;
    pthread_mutex_unlock(&event->lock);
    return r;
}
Go to the top of the page
 
+Quote Post



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

 


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


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