Простейшая модель параллелизма - PullRequest
2 голосов
/ 15 марта 2011

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

Как мне сделать следующее в C #:

Исходное состояние:

semaphore counter = 0

Тема 1:

// Block until semaphore is signalled
semaphore.Wait(); // wait until semaphore counter is 1

Тема 2:

// Allow thread 1 to run:
semaphore.Signal(); // increments from 0 to 1

Это не мьютекс, потому что нет критической секции, точнее, можно сказать, что существует бесконечная критическая секция. Так что же это?

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Re "как" ... ну, вы можете использовать семафор , Mutex или событие сброса ( ManualResetEvent , AutoResetEvent ), но лично я использую Monitor для этого;

object sync = new object();

нить 1:

lock(sync) { // blocks until it successfully takes (re-entrant) lock on sync
    // here: launch thread 2, to ensure thread 1 has the lock first
    Monitor.Wait(sync); // releases lock(s) and waits for pulse,
                        // then retakes locks(s) when free
} // releases lock (or decrement by 1)

нить 2:

lock(sync) { // blocks until it successfully takes (re-entrant) lock on sync
    Monitor.Pulse(sync); // moves a waiting thread into the ready-queue
                         // (but the awoken thread still can't continue until
                         // it gets the lock itself - and we still hold it)
} // releases lock (or decrement by 1)
1 голос
/ 25 марта 2011

Семафор, инициализированный 1, можно рассматривать [прочитано: используется ] как мьютекс.Конкретный сценарий, который вы описываете, - это семафор , использующий систему сигнализации между двумя потоками .Первый поток пытается заблокировать ресурс [получить семафор], но блокируется [потому что семафор был инициализирован нулем], пока второй поток не сигнализирует потоку 1, что он может ввести оставшуюся часть кода.Отличная статья на эту тему:

http://geekswithblogs.net/shahed/archive/2006/06/09/81268.aspx

1 голос
/ 15 марта 2011

То, что вы написали, просто мьютекс; мьютекс в основном такой же, как семафор со значением 1. А - это «критическая секция» - это кодовая последовательность, которая выполняется, пока мьютекс удерживается любым потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...