То, что это работает, в основном случайно. Если вы хотите делать подобные вещи надежно, вам просто нужно использовать какой-то механизм IPC, предоставляемый ОС, возможно, с Boost Interprocess (например, мьютекс или семафор), чтобы сделать более переносимым интерфейс.
volatile
, хотя его часто выдвигают в качестве решения подобных проблем, не является ни необходимым, ни достаточным. Это может сильно повлиять на производительность, но все же недостаточно для правильной работы потоков. Если вы программируете для .NET, Microsoft определила свою версию volatile
, чтобы обеспечить (хотя бы некоторую степень) безопасность потоков. В противном случае (в реальном C или C ++) он малопригоден и может причинить значительный вред.
Я должен также упомянуть, что это - длинный способ с момента первой ошибки. Еще тогда, когда не менее авторитетный, чем Андре Александреску, написал в «Докторе Доббс» довольно содержательную статью об использовании volatile
для многопоточности. С тех пор он осознал, что был неправ, но (в значительной степени) ущерб был нанесен, тем более что volatile
настолько близок к тому, чтобы делать правильные вещи, что очень легко ошибочно принять его за правильность / полезность в потоке .