Простая многопоточная реализация стека с использованием условных переменных - PullRequest
0 голосов
/ 13 марта 2019

В нашем курсе CS мы использовали потоковое программирование POSIX для реализации простой структуры данных стека.Поэтому мы использовали pthread_cond_wait и pthread_cond_signal:

pthread_mutex_t write_mutex; 
pthread_mutex_t read_mutex; 

pthread_cond_t write_cond; 
pthread_cond_t read_cond;

int read()
{
    pthread_mutex_lock(&read_mutex); 
    while(is_empty())
    {
        pthred_cond_wait(&read_cond, &read_mutex);
    }
    // read value [...]
    pthread_cond_signal(&write_cond);
    pthread_mutex_unlock(&read_mutex);

    return read_value;

}

Функция записи реализована аналогично, но блокирует write_mutex и сигнализирует read_cond вместо.

Q: Моя проблема с этой реализацией заключается в следующем: не требует ли это соотношение 1: 1 между чтениями и записями из-за сигнализации?Эта реализация не позволяет записывать несколько элементов без каких-либо чтений между ними, поскольку каждая запись требует сигнала, инициируемого функцией чтения (и наоборот, множественным чтением).

Правильно ли мое понимание или я что-то упустил?

Q2 Как долго сигнал "действителен" после вызова pthread_cond_signal(...)?

1 Ответ

2 голосов
/ 13 марта 2019

Q : Моя проблема с этой реализацией заключается в следующем: не требует ли это соотношение 1: 1 между чтениями и записями из-за сигнализации? это реализация не позволяет писать несколько элементов без каких-либо читает между, так как каждая запись требует сигнала, запускаемого в функция чтения (наоборот, многократное чтение).

Если функция write() действительно аналогична представленной функции read(), то да и нет. Я думаю, вы предполагаете, что в стеке никогда не может быть более одного элемента, но это, в частности, не так. Обратите внимание, как поток, входящий в вашу функцию read() и находящий непустой стек, будет вообще обходить ожидание переменной условия. Поток ожидает чтения, только если стек пуст. Аналогом с другой стороны будет то, что потоки ожидают записи, только если стек заполнен до отказа.

Q2 Как долго сигнал "действителен" после вызова pthread_cond_signal (...)?

Нет времени вообще. Только потоки, уже ожидающие переменную условия, могут быть разблокированы, когда это CV передано. После этого не будет никакой памяти о полученном сигнале, даже если он не был разблокирован ни одним потоком.

...