Определите, что вы подразумеваете под «атомным». Вы имеете в виду «атомарный» в том смысле, что никакой другой процесс или поток не будет выбран для планирования при запуске вашей функции? Или вы имеете в виду, что любые общие объекты, на которые есть ссылки в вашей функции, не будут изменены никакими другими потоками во время выполнения вашей функции?
Во-первых, вы не можете реально контролировать это из пространства пользователя. Если вы используете однопроцессорную машину, вы можете , возможно, гарантировать атомарность, повысив приоритет вашего процесса до максимально возможного (из пользовательского пространства). Но даже в этом случае это не гарантируется, потому что ваш алгоритм планирования может по-прежнему запускать другой процесс. Единственный надежный способ сделать это из операционной системы. Для машины с одним процессором вы бы отключили прерывания. Для многоядерного компьютера вам необходимо заблокировать шину и дождаться, пока все процессы, запущенные на других процессорах, будут отключены.
Здесь возникает вопрос: почему вы хотите гарантировать атомарность? В целом, требование о том, что может выполняться только ваш процесс, а не другие, не должно существовать в пространстве пользователя. Если вы хотите убедиться, что определенные структуры данных доступны только одному потоку за раз, вам следует использовать переносную библиотеку потоков (например, pthread
) и отгородить свою функцию от критической секции.