Я считаю, что исключение частичной записи в память в неатомарную переменную требует мьютексирования, я не уверен, что это единственный способ убедиться, что нет конфликта записи, но это достигается следующим образом
#include <mutex>
#include <thread>
std::mutex mtx;
void threadFunction(double* d){
while (*d < 100) {
mtx.lock();
*d += 1.0;
mtx.unlock();
}
}
int main() {
double* d = new double(0);
std::thread thread(threadFunction, d);
while (true) {
if (*d == 100) {
break;
}
}
thread.join();
}
Который добавит 1.0
к d
100 раз потокобезопасным способом.Блокировка и разблокировка мьютекса гарантируют, что только один поток обращается к d
в данный момент времени.Тем не менее, это значительно медленнее, чем эквивалент atomic
, потому что блокировка и разблокировка стоят очень дорого - я слышал разные вещи в зависимости от операционной системы и конкретного процессора и того, что блокируется или разблокируется, но это примерно 50 тактовых циклов дляэтот пример, но это может потребовать системного вызова, который больше похож на 2000 тактов.
Мораль : используйте с осторожностью.