2013-09-27 6 views
0

Я не понимаю, как это должно работать, потому что независимо от того, в какое время (test_and_set (& lock) возвращается, является ли оно истинным или ложным, код {} будет по-прежнему запускать критический раздел. ничего не делать, а затем сразу же запустить критическую секцию, так как это поможет синхронизировать нити?Как работает этот алгоритм синхронизации?

+1

Это, очевидно, не является потокобезопасным. Кто говорит, что это так? – usr

+0

'while (test_and_set (& lock));' будет зацикливаться до тех пор, пока не станет ложным, а затем запустит критический раздел. Не совсем понимаю, что делает 'test_and_set', хотя – clcto

+0

Это на любой конкретной платформе, на которую вы нацеливаетесь? потому что есть встроенные функции платформы, которые, вероятно, сделают это * правильно * для вас. Чтобы ответить на ваш вопрос о том, как это работает, честно говоря, * это не * (конечно, не надежно). – WhozCraig

ответ

2

это не независимо от того, что test_and_set возвращается. Обратите внимание, что test_and_set возвращает предыдущее значение местоположения, предоставленного ему, так while(test_and_set(&lock)); (примечание завершающая точка с запятой!) будет вращаться на процессоре, а другой поток «владеет» блокировкой.

Обратите внимание, однако, что ваша фактическая реализация test_and_set не является атомарной и, следовательно, фактически не потокобезопасна.

Возможно, это поможет, если я переформатирую ваш код, чтобы выглядеть так?

do { 
    while (test_and_set(&lock)) { 
     /* do nothing */ 
    } 
    /* critical section */ 
    lock = false; 
    /* remainder section */ 
} while (true); 
+0

Итак, если это lock = true, он ничего не делает, и если lock = false, он запускает критический раздел, а затем помещает lock в false, чтобы другой поток мог запускать его? Как бы вы сделали его атомарным? – fogofwar

+0

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

Смежные вопросы