Когда был бы я использовать AutoResetEvent и ManualResetEvent вместо Монитора. Ожидайте () / Монитор. Импульс ()?

typedef typename Tail::inUnion dummy;

Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.

template  struct Contains;

template 
struct Contains >
{
    enum { result = Contains::result };
};

template 
struct Contains >
{
    enum { result = true };
};

template 
struct Contains
{
    enum { result = false };
};

PS: Посмотрите на Boost :: Variant

PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design

20
задан abatishchev 12 March 2012 в 08:41
поделиться

3 ответа

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

Использование монитор, если Вы хотите ограничить доступ к структуре данных путем ограничения, сколько потоков может получить доступ к нему.

Мониторы обычно защищают ресурс, тогда как события говорят Вам, что что-то происходит, как закрывающееся приложение.

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

15
ответ дан 30 November 2019 в 00:19
поделиться

Это учебное руководство подробно изложило описания того, что необходимо будет знать: http://www.albahari.com/threading/

, В частности, это покроет классы XXXResetEvent,
http://www.albahari.com/threading/part2.aspx

, и это покроет, Ожидайте/Пульсируйте: http://www.albahari.com/threading/part4.aspx#_Wait_and_Pulse

2
ответ дан 30 November 2019 в 00:19
поделиться

In my opinion, it's better to use Monitor if you can, Monitor.Wait and Monitor.Pulse/PulseAll are used for signalling between threads (as are Manual/AutoResetEvent) however Monitor is quicker, and doesn't use a native system resource. Also apparently Monitor is implemented in user mode and is managed, whereas Manual/AutoResetEvents require switching to kernel mode and p/invoke out to native win32 calls that use a wait handle.

There are situations where you would need to use Manual/AutoResetEvent, for example, to signal between processes you can use named events, and I guess to signal native threads in your app.

I am just regurgitating what I have read in this excellent article about threading.

The whole article is worth reading, however the link takes you to the wait handle section that details the events and monitor wait/pulse.

10
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: