threads
От: csharper  
Дата: 12.05.05 07:08
Оценка:
Hi

Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?

Спасибо!
... << RSDN@Home 1.1.4 beta 6a rev. 444>>
Re: threads
От: LuciferMoscow Россия  
Дата: 12.05.05 07:14
Оценка:
Здравствуйте, csharper, Вы писали:

C>Hi


C>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


C>Спасибо!

в boost вроде threadы были( www.boost.org ) может это тоже....
Re[2]: threads
От: csharper  
Дата: 12.05.05 07:16
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, csharper, Вы писали:


C>>Hi


C>>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


C>>Спасибо!

LM>в boost вроде threadы были( www.boost.org ) может это тоже....

Ага, я смотрел. Но что-то не нашел ивентов
... << RSDN@Home 1.1.4 beta 6a rev. 444>>
Re[3]: threads
От: CrystaX Россия https://crystax.me/
Дата: 12.05.05 07:20
Оценка: 2 (1) +3 :))) :)
Здравствуйте, csharper, Вы писали:

C>Ага, я смотрел. Но что-то не нашел ивентов


Сейчас придет Максим Егорушкин и скажет, что ну их нафиг, эти убогие виндовые events, лучше использовать condition variables.
Это я не в качестве наезда (ни на Егорушкина, ни на condition variables).

А если серьезно, то в POSIX системах нет events. Есть как раз таки condition variables.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re: threads
От: MaximE Великобритания  
Дата: 12.05.05 07:21
Оценка: 2 (1) +1 :))) :))) :))
csharper wrote:

> Hi

>
> Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?

boost::thread. Только тебе придется забыть про event и освоить condition variables.

http://rsdn.ru/Forum/?mid=638679
Автор: MaximE
Дата: 13.05.04

http://rsdn.ru/Forum/?mid=1021046
Автор: MaximE
Дата: 11.02.05


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: threads
От: LuciferMoscow Россия  
Дата: 12.05.05 07:25
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, csharper, Вы писали:

C>>Ага, я смотрел. Но что-то не нашел ивентов
CX>Сейчас придет Максим Егорушкин и скажет, что ну их нафиг, эти убогие виндовые events, лучше использовать condition variables.
CX>Это я не в качестве наезда (ни на Егорушкина, ни на condition variables).
CX>А если серьезно, то в POSIX системах нет events. Есть как раз таки condition variables.
Не знаю кто такие condition variables, но они могут работать в разных процессах?
Re[5]: threads
От: CrystaX Россия https://crystax.me/
Дата: 12.05.05 07:29
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Не знаю кто такие condition variables, но они могут работать в разных процессах?


Насколько я знаю, да. Только при этом они должны находиться в разделяемой процессами памяти.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[5]: threads
От: MaximE Великобритания  
Дата: 12.05.05 07:31
Оценка: +4 -2
LuciferMoscow wrote:

[]

> Не знаю кто такие condition variables,


bad for you

> но они могут работать в разных процессах?


POSIXные могут. boost::thread не предоставляет такого функционала, т.к. он не был бы доступен на не POSIX платформах.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: threads
От: CrystaX Россия https://crystax.me/
Дата: 12.05.05 07:34
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Не знаю кто такие condition variables, но они могут работать в разных процессах?


CX>Насколько я знаю, да. Только при этом они должны находиться в разделяемой процессами памяти.


И должен быть установлен аттрибут PTHREAD_PROCESS_SHARED
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[6]: threads
От: LuciferMoscow Россия  
Дата: 12.05.05 07:53
Оценка: -1
Здравствуйте, MaximE, Вы писали:

ME>LuciferMoscow wrote:

ME>[]
> Не знаю кто такие condition variables,
ME>bad for you
очень информатвно
Re: threads
От: Mr.Chipset Россия http://merlinko.com
Дата: 12.05.05 08:49
Оценка: 2 (2) +1
Здравствуйте, csharper, Вы писали:

C>Hi


C>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


C>Спасибо!

Гугль рулез форева
Кроме Boost::Thread, который вероятно войдет в Стандарт C++ кстати :
ZThread
OpenThreads
Common C++(не только триды)
С++ portable components
Сюда в общем загляни.
... << А писал я этот бред на RSDN@Home 1.1.4 beta 7 rev. 447, под звуки Scorpions — Under The Same Sun>>
"Всё что не убивает нас, делает нас сильнее..."
Re[2]: threads
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 12.05.05 09:37
Оценка: +1
Здравствуйте, Mr.Chipset, Вы писали:

MC>Здравствуйте, csharper, Вы писали:


C>>Hi


C>>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


C>>Спасибо!

MC>Гугль рулез форева

+1 (http://www.google.com/Top/Computers/Programming/Languages/C%2B%2B/Class_Libraries/?il=1)

MC>Кроме Boost::Thread, который вероятно войдет в Стандарт C++ кстати :

MC>ZThread
MC>OpenThreads
MC>Common C++(не только триды)
MC>С++ portable components
MC>Сюда в общем загляни.

Еще ACE (ну нравиться мне эта штука, хоть и большая она), APR, wxBase. В этих трех библиотеках не только многопоточность, но и много другого вкусного.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: threads
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 12.05.05 10:15
Оценка: 5 (2)
Здравствуйте, Mr.Chipset, Вы писали:

MC>Кроме Boost::Thread, который вероятно войдет в Стандарт C++ кстати :


А может и не войдет
http://lists.boost.org/boost/2005/05/25846.php
Re[3]: threads
От: Mr.Chipset Россия http://merlinko.com
Дата: 12.05.05 10:43
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Здравствуйте, Mr.Chipset, Вы писали:


MC>>Кроме Boost::Thread, который вероятно войдет в Стандарт C++ кстати :


A>А может и не войдет

A>http://lists.boost.org/boost/2005/05/25846.php

Тогда, в принципе не стоит считать это преимуществом и начать поиски лучшей библиотеки
... << А писал я этот бред на RSDN@Home 1.1.4 beta 7 rev. 447, под звуки The Scorpions — Wind Of Change>>
"Всё что не убивает нас, делает нас сильнее..."
Re[2]: threads
От: Tom Россия http://www.RSDN.ru
Дата: 12.05.05 13:43
Оценка:
ME>boost::thread. Только тебе придется забыть про event и освоить condition variables.
А можно вкратце что сие есть таке?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[3]: threads
От: CrystaX Россия https://crystax.me/
Дата: 12.05.05 13:51
Оценка:
Здравствуйте, Tom, Вы писали:

ME>>boost::thread. Только тебе придется забыть про event и освоить condition variables.

Tom>А можно вкратце что сие есть таке?

Механизм ожидания наступления определенного события.
Вот: здесь, здесь
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[3]: threads
От: Amethyst  
Дата: 26.05.05 14:36
Оценка: 10 (4)
Здравствуйте, csharper, Вы писали:

C>Ага, я смотрел. Но что-то не нашел ивентов

Event можно рассматривать как семафор, max count которого равен единице. Комбинируя мьютекс и семафор ты можешь "руками" сделать аналог эвента.
В своё время я так поступал, вариант Виндовс/Линукс. Посмотри, может пригодится .
/------------------------------------------------------------
// Event, i.e. semaphore which maxcount == 1
//------------------------------------------------------------
class Event
{    
public:
    Event()
    {
        #ifdef WIN32
            event_ = ::CreateEvent(0, FALSE, FALSE, 0);
        #else
            ::sem_init(&event_, 0, 0);
        #endif
    }

    ~Event()
    {
        #ifdef WIN32
            ::CloseHandle(event_);
        #else
            ::sem_destroy(&event_);
        #endif
    }

    void signal()
    {
        #ifdef WIN32
            ::SetEvent(event_);
        #else
            Guard guard(mutex_);
            int value;
            ::sem_getvalue(&event_, &value);
            if( !value )
                ::sem_post(&event_);
        #endif
    }

    bool wait(uint time)
    {
        #ifdef WIN32
            return ::WaitForSingleObject(event_, time) == WAIT_OBJECT_0;
        #else
            timespec tm;
            tm.tv_sec  =  time / 1000;
            tm.tv_nsec = (time % 1000) * 1000000;
            return !::sem_timedwait(&event_, &tm);
        #endif
    }

    bool check()
    {
        #ifdef WIN32
            return ::WaitForSingleObject(event_, 0) == WAIT_OBJECT_0;
        #else
            return !::sem_trywait(&event_);
        #endif
    }

private:
    sem_t  event_;
#ifndef WIN32
    Mutex  mutex_;   
#endif
};


//------------------------------------------------------------
// Mutex class
//------------------------------------------------------------
class Mutex
{
public:
    Mutex()
    {
        #ifdef WIN32
            ::InitializeCriticalSection(&mutex_);
        #else
            ::pthread_mutex_init(&mutex_, 0);            
        #endif        
    }

    ~Mutex()
    {
        #ifdef WIN32
            ::DeleteCriticalSection(&mutex_);
        #endif
    }

    void lock()
    {
        #ifdef WIN32
            ::EnterCriticalSection(&mutex_);
        #else
            ::pthread_mutex_lock(&mutex_);
        #endif
    }

    bool trylock() // true if mutex is free
    {
        #ifdef WIN32
            return !!::TryEnterCriticalSection(&mutex_);
        #else
            return !::pthread_mutex_trylock(&mutex_);
        #endif
    }
    
    void unlock()
    {
        #ifdef WIN32
            ::LeaveCriticalSection(&mutex_);
        #else
            ::pthread_mutex_unlock(&mutex_);
        #endif
    }

private:
    pthread_mutex_t mutex_;
};

//------------------------------------------------------------
// Auto protection class
//------------------------------------------------------------
class Guard
{
public:
    Guard(Mutex& m) : mutex_(m) { mutex_.lock(); }
    ~Guard() { mutex_.unlock(); }

private:
    Mutex&   mutex_;
};


Да, в начале нужно вот ещё чего добавить.

#ifdef WIN32
    #include <windows.h>

    typedef CRITICAL_SECTION    pthread_mutex_t;
    typedef HANDLE              sem_t;

#else
    #include <pthread.h>
    #include <semaphore.h>

#endif


Вроде всё.
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Re[4]: threads-вдогонку
От: Amethyst  
Дата: 27.05.05 13:03
Оценка: +1
Вдогонку на всякий случай хочу заметить, что не стоит оптимизировать класс Event, и вместо пары семафор-мьютекс использовать только один мьютекс. Изначально я так и хотел поступить поскольку мьютекс можно рассматривать как бинарный семафор. Но беда в том что posix mutex должен быть разблокирован тем же потоком, каким он был заблокирован. Это довольно существенное ограничение .
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Re: threads
От: Bork СССР  
Дата: 28.05.05 06:17
Оценка:
Здравствуйте, csharper, Вы писали:

C>Hi


C>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


C>Спасибо!


The ADAPTIVE Communication Environment (ACE(TM))
http://www.cs.wustl.edu/~schmidt/ACE.html

есть все это, плюс многое другое. кросс-платформенная и бесплатная. хорошо документированная, есть даже книжка на русском языке в стиле Getting Startes.
Re[4]: threads
От: Kerrigan  
Дата: 06.10.05 18:29
Оценка:
Здравствуйте, Amethyst, Вы писали:

В коде Eventа у Вас ошибка в линуксовой части в методе wait. Должно быть так
timespec tm;
tm.tv_sec  =  ::time(0) + time / 1000;
tm.tv_nsec = (time % 1000) * 1000000;

return !::sem_timedwait(&event_, &tm);

ожидание отсчитывается относительно текущего времени. Остальное все работает.
Re[5]: threads
От: MaximE Великобритания  
Дата: 07.10.05 06:26
Оценка:
Здравствуйте, Kerrigan, Вы писали:

K>Здравствуйте, Amethyst, Вы писали:


K>В коде Eventа у Вас ошибка в линуксовой части в методе wait. Должно быть так

K>
K>timespec tm;
K>tm.tv_sec  =  ::time(0) + time / 1000;
K>tm.tv_nsec = (time % 1000) * 1000000;

K>return !::sem_timedwait(&event_, &tm);
K>

K>ожидание отсчитывается относительно текущего времени. Остальное все работает.

С time() ты потерял точность. Используй вместо time() http://www.opengroup.org/onlinepubs/009695399/functions/clock_settime.html
Re: threads
От: srggal Украина  
Дата: 07.10.05 08:05
Оценка:
Здравствуйте, csharper, Вы писали:

C>Hi


C>Существует ли бесплатная кросс-платформенная (сейчас нужны win + linux) библиотека для работы с потоками и синхронизации (нужны критические секции и события)?


Быть может ACE спасет отца руской демократии?

ЗЫ Насчет бесплатности на все 100 не уверен.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: threads
От: srggal Украина  
Дата: 07.10.05 08:08
Оценка:
Здравствуйте, Bork, Вы писали:

От себя добавлю, что это не просто библиотека а фоеймворк, но гибкий:
— Есть желание — юзай фреймворк,
— Нет — юзай короссплатформенные низкоуровневые ( посравнению с фреймворком ) функции
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.