Как устроен мьютекс внутри( например 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, не будет ли он загружать процессор?
Или лучший вариант изменить архитектуру приложения и не ждать сразу несколько событий?
Продвижение своими сайтами как стратегия роста и независимости