Форум программистов, компьютерный форум CyberForum.ru

Атомарна ли операция присваивания в однопроцессорной машине? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Распечатать ту строку, которая содержит наибольшее количество заданных пользователем знаков пунктуации http://www.cyberforum.ru/cpp-beginners/thread1025831.html
помогите решить пожалуйста Даны две строки, содержащие не более 100 символов. Строки состоят из слов, разделенных пробелами. Распечатать ту строку, которая содержит наибольшее количество заданных пользователем знаков пунктуации (от 1 до 3-х).
C++ Преобразование выражения в ОПЗ Доброго времени суток! Помогите написать комменты к программе, "что за что отвечает и зачем оно нужно". Просто не очень соображаю в этой области, а здать нужно. Спасибо! int findprior (char n){ int a; switch(n){ case '+': a=1; break; case '-': a=1; break; http://www.cyberforum.ru/cpp-beginners/thread1025810.html
не могу задать правильный if C++
#include <stdio.h> #include <stdlib.h> #include <math.h> int main () { const float C=3.7; const int A=7; int D; float B,S,F; printf("Vvedite D,B");
Динамический двумерный массив C++
1.С помощью realloc из массива n*m удалить i-ую строку 2.С помощью realloc из массива n*m добавить после i-ой строки строку, заполненную числом x удаление for(j=i;j<n-1;j++) a=a; delete a; a=(int**)realloc((void *) a,(n-1)*sizeof(int*)); n--; добавление
C++ smart pointer с указателем на new[] http://www.cyberforum.ru/cpp-beginners/thread1025781.html
Как я понимаю, реализация shared_ptr boost или tr1 подразумевает, что в неё будет передан одиночный объект, который будет удален через delete. Есть ли аналог shared_ptr для массива объектов, выделенных через new?
C++ Дана последовательность целых чисел Помогите пожалуйста решить задачу в С++. Дана последовательность целых чисел. Подсчитать количество элементов, не попадающих в заданный интервал. Нужно решить используя одномерный и двумерный массив. подробнее

Показать сообщение отдельно
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,325
Завершенные тесты: 1
03.12.2013, 11:56     Атомарна ли операция присваивания в однопроцессорной машине?
Цитата Сообщение от newbie666 Посмотреть сообщение
В общем, если сомневаешься, просто надо код дизассемблера смотреть да и всё
Нет, это ненадежно.
Сегодня компилятор сгенерирует один код, завтра другой. Для корректного
параллельного программирования нужны гарантии, как на уровне языка/компилятора,
так и на уровне процессорной архитектуры. Если вы программируете в Visual C++,
то следует использовать или примитивы синхронизации, такие как критические секции,
мьютексы, семафоры, спин-блокировки и тому подобное, или Interlocked-функции,
или std::atomic/boost::atomic. Без этого максимум, на что можно рассчитывать -
это что операцию типа "a = 123" компилятор сведет к инструкции mov и тем самым
обеспечит ее атомарность. Но даже в этом случае могут возникнуть проблемы.
Например, если вместо "mov [mem], reg" компилятор сделает "mov reg, reg", то
другие потоки не получат нового значения переменной a, потому что запись пошла в
регистр, а не в память. Да и запись в память еще ничего не обещает в плане
видимости данных между потоками, так как у процессоров есть т.н. store buffers, в
которых они кэшируют операции записи некоторое время. Без использования "гарантий"
компилятор может перемешать инструкции в генерируемом машинном коде, так что
зависимые операции будут выполняться не в том порядке, который ожидается.
А потом то же самое может сделать CPU, если не указать ему обратное.

Эти вещи - часть одной большой трилогии под названием "atomicity, visibility, order"
(атомарность, видимость, порядок), их нельзя рассматривать поодиночке.

Парочка полезных ссылочек здесь: Что такое "volatile int"
 
Текущее время: 08:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru