Лучший способ синхронизировать два потока на основе следующего сценария? - PullRequest
1 голос
/ 07 февраля 2012

Это может показаться базовым для вопроса, но у меня никогда не было формального (если есть) ответа на него.

Каков наилучший (эффективный) способ синхронизации следующего:

  • Тема 1: в то время как (1) чтения (shared_data)

  • Тема 2: в то время как (1) замок (shared_mutex) записи (shared_data) разблокировать (shared_mutex)

Если то, что делает только Поток 1, читает данные, нужно ли ему также блокировать мьютекс? или только поток записи должен сделать это?

Thanx

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Короткий ответ Все потоки, которые получают доступ к общим данным, должны получить блокировку, защищающую эти данные.

Длинный ответ Если считыватель не блокирует данные для чтения, поток может закончить чтение поврежденных данных, если записывающий поток записывает данные, пока читатель их читает. И в современном многоядерном / многопроцессорном мире не стоит полагаться на то, что любой тип данных атомарно безопасен для чтения или записи.

Edit (By Shahbaz) : На самом деле, в вашем примере Thread 2 всегда успешно блокирует мьютекс, поэтому синхронизация вообще не происходит. В вашем простом случае ответ также очень прост:

Thread 1:
    while(1)
        lock(shared_mutex)
        read(shared_data)
        unlock(shared_mutex)

Thread 2:
    while(1)
        lock(shared_mutex)
        write(shared_data)
        unlock(shared_mutex)
0 голосов
/ 07 февраля 2012

Если у вас есть только 2 потока, мьютекс не делает ничего полезного. Если для T2 все в порядке, чтобы изменить shared_data, в то время как T1 читает это, тогда удалите мьютекс. Если (и это, скорее всего) НЕТ (все в порядке) (поскольку T1 при однократном чтении может видеть некоторые старые и некоторые новые данные), тогда T1 необходимо защитить чтение с помощью вызовов мьютекса.

0 голосов
/ 07 февраля 2012

Если чтение во время записи не является проблемой, тогда вам не нужна блокировка для чтения, но тогда вам не нужна блокировка для записи. Поэтому вам нужно заблокировать во время чтения здесь.

...