Как устроен мьютекс внутри( например 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
, не будет ли он загружать процессор?
Или лучший вариант изменить архитектуру приложения и не ждать сразу несколько событий?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При попытке поместить результат этой функции в указатель, в него помещается NULL
Есть массив путей к файлам, к этому массиву через mapped() применяется некоторая функция с чтением внутриЗапустил на сервере(Xeon E5335) на большом...
Код собирается с target AVX2, при разборе "хвоста" решил использовать __m64, в результате после использования _mm_cmpeq_pi8 переменная типа double приобретает...