Почему мьютекса недостаточно? - PullRequest
0 голосов
/ 24 августа 2018

Зачем нам нужны семафор , условная переменная s и другие конструкции.Я получаю, что поток блокируется до тех пор, пока сигнал не станет лучше, чем поток, который принимает блокировку мьютекса , проверяет условие , которое, если не проходит, разблокирует и повторяет попытку до условие проходит.
Помимо этого, есть ли какая-либо другая выгода.Например, можем ли мы реализовать блокировку чтения-записи , используя только mutex ... Что-то, как показано ниже:

int writers = 0;
int readers = 0;
mutex lock;

read_lock()
{
    mutex_lock(&lock);
    while(writers == 1)
    {
        mutex_unlock(&lock);  // unlock
        mutex_lock(&lock);    // retry
    }
    readers++;
    mutex_unlock(&lock);    
}

read_unlock()
{
    mutex_lock(&lock);
    readers--;
    mutex_unlock(&lock);
}

write_lock()
{
    mutex_lock(&lock);
    while(r>0 || w==1)
    {
        mutex_unlock(&lock);  // unlock
        mutex_lock(&lock);    // retry
    }
    writers++;
    mutex_unlock(&lock);      
}

write_unlock()
{
    mutex_lock(&lock);
    writers--;
    mutex_unlock(&lock);
}

1) Будет ли вышеописанная реализация дажеРабота?Если нет, то почему?
2) Могу ли я сказать, что все в многопоточности можно сделать, используя только мьютекс?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Re, «Зачем нам нужны ... конструкции?»

Потому что слоев абстракции и повторного использования кода .

Например, не нужно , чтобы иметь очередь блокировки. Если у вас есть массивы и указатели, мьютекс и переменная условия, вы можете использовать их для реализации всего, что вы могли бы реализовать с помощью очереди блокировки. Но ваш код будет намного сложнее читать, потому что в каждом месте, где вы могли просто позвонить q.put(...) или q.take(), вам придется вместо этого написать целую кучу строк кода.

Блокирующая очередь - это полезная абстракция : она объединяет идеи более низкого уровня в более простую функцию более высокого уровня.

Вам не нужно семафор , если у вас есть очередь блокировки. Все, что вы можете сделать с семафором, вы можете сделать, поместив бессмысленные токены в очередь и затем удалив их. Семафор действительно является более простой версией идеи очереди, и он может быть ближе к (лучшему описанию) проблемы, которую вы пытаетесь решить.

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

0 голосов
/ 24 августа 2018

Мьютекс предназначен для защиты общей переменной (между потоками). Он не предназначен для обеспечения синхронизации.

Я попытаюсь привести пример. Предположим, что у нас есть связанный список, которым мы должны поделиться, и нам нужно раскрутить 10 потоков - 5 из них отвечают за запись в связанный список, а 5 Ответственность за чтение из связанного списка. Мы должны рассматривать связанный список как очередь (FIFO) - писать в конец списка, читать с начала списка Все потоки требуют монопольного доступа к связанному списку (так как читатели будут удалять элементы из заголовка очереди, когда писатель добавляет к хвосту очереди), а также имеют случайную задержку для вычислений (или просто предполагают, что им нужно спать) Вопрос сейчас: КАК мы собираемся обеспечить целостность головы и ног очереди ??

Кажется невозможным использование только мьютекса, верно? Вот почему НЕТ, мьютекс не достаточно во всех случаях.

В моем случае нам понадобится условная переменная Используя эти переменные и уведомляя другие потоки через трансляцию (или даже индивидуально), мы сможем добиться синхронизации между нашими потоками, обеспечивая целостность головы и ног, которые мы разделяем.

PS: Еще одна хорошая точка зрения такова. PS

...