Когда я обнаружил инструкцию «CAS», я помню, что хорошо понимал, что она может работать для потоков, работающих на одном процессоре, но я был удивлен, что она может работать для многих процессоров.
Вчера у меня появилась первая возможность протестировать его на одной из своих разработок. Я реализовал это, и это действительно сработало; все мои модульные тесты были зелеными. Идеально.
Но сегодня я запустил свои модульные тесты на другой машине, и теперь они терпят неудачу. Менее совершенный
Основное различие между двумя машинами заключается в том, что первая (та, на которой юнит-тесты зеленые) — это довольно старый ноутбук с одним ядром! Второй - более свежий i7 и более мощный...
Теперь, на моем i7, если я заставлю свои модульные тесты работать на одном ядре, они станут успешными. Я делаю это, запустив
taskset -c <cpu-id> my-unit-test
Законно, мой первоначальный вопрос возвращается: работает ли CAS на многих ядрах? Хорошо, судя по тому, что я читал, я был бы удивлен, если бы это было не так...
И что? Я надеюсь, что это происходит из-за ошибки в моем коде. Чтобы дать вам больше информации, у меня есть класс с критической секцией. я добавил атрибут
bool m_isBeingModified;
Он инициализируется как false
. Более того, в начале моей критической секции я запускаю функцию
inline void waitForClassBeingModified()
{
while (!__sync_bool_compare_and_swap(&m_isBeingModified, false, true))
{} /// I concider that I can to such a loop as my critical section is very light/short
}
Наконец, в конце моего критического раздела я сбрасываю свою логическую переменную
m_isBeingModified = false;
Я попытался установить свой атрибут как volatile
, но это ничего не изменило: мои модульные тесты все еще не работают.
Последняя информация:
gcc --version
gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Спасибо за помощь