WaitForMultipleObjects для linux

228
10 апреля 2022, 09:00

Как устроен мьютекс внутри( например pthread_mutex_t)? В частности интересует что происходит при вызове pthread_mutex_lock, при условии, что эта функция уже где-то была вызвана, будет ли ожидающий поток занимать процессор?

Вообще мне нужне кроссплатформенный аналог WaitForMultipleObjects под linux. Насколько я понимаю pthread такой возможности не предоставляет.

Является такая замена адекватной:

class Events
{
public:
    enum WaitResult
    {
        EVT_WAIT_ERROR   = -1,
        EVT_WAIT_TIMEOUT  = -2
    };
    WaitEvents(unsigned int capacity)
    {
        _capacity = capacity;
    }
    void set(const unsigned int index)
    {
        if(index >= 0 && index < _capacity)
        {
            _mtx.lock();
            _bits |= (1 << index);
            _mtx.unlock();
        }
    }
    void reset(const unsigned int index)
    {
        if(index >= 0 && index < _capacity)
        {
           _mtx.lock();
           _bits &= ~(1 << index);
           _mtx.unlock();
        }
    }
    int wait(unsigned int timeout)
    {
        Timer expiration(Timer::now() + timeout); 
        do
        {
             _mtx.lock();
             for ( unsigned int i = 0; i < _capacity; ++i)
             {
                 unsigned int mask = 1 << i;
                 if ((_bits & mask) == mask)
                 {
                     _mtx.unlock();
                     return i;
                 }
             }
             _mtx.unlock();
        }while( Timer::now() < expiration)
        return EVT_WAIT_TIMEOUT;
    }
private:
    WaitEvents(const WaitEvents&) = delete;
    const unsigned int _capacity;
    Mutex _mtx;
    unsigned int _bits;
};

В этом варианте мне не нравится постоянный опрос Events::_bits, не будет ли он загружать процессор?

Или лучший вариант изменить архитектуру приложения и не ждать сразу несколько событий?

READ ALSO
Функция glfwCreateWindow из библиотеки GLFW возвращает null

Функция glfwCreateWindow из библиотеки GLFW возвращает null

При попытке поместить результат этой функции в указатель, в него помещается NULL

117
QtConcurrent::mapped() загрузка ядра

QtConcurrent::mapped() загрузка ядра

Есть массив путей к файлам, к этому массиву через mapped() применяется некоторая функция с чтением внутриЗапустил на сервере(Xeon E5335) на большом...

209
SIMD вызов _mm_cmpeq_pi8 портит память

SIMD вызов _mm_cmpeq_pi8 портит память

Код собирается с target AVX2, при разборе "хвоста" решил использовать __m64, в результате после использования _mm_cmpeq_pi8 переменная типа double приобретает...

151
Задача на массивы

Задача на массивы

Задача CПохожие массивы (Время: 1 сек

140