Lasot kārtējo daily WTF/LOL, atcerējos vecu GCC un Linux kernel saraksti par vairākpavedienu programmām. Kas ir vēl viens pierādījums, ka vairākpavedienu programmas C++ nav nekāda medusmaize. Taisnību sakot, medusmaize tā nav arī citās valodās. If someone uses “instantly understand” and “threading” in the same sentence, my brain rewrites that sentence to say “doesn’t really understand threading.”
Atbilstoši C/C++ standartiem, kompilatoram no šķietami pareiza koda ir tiesības ģenerēt dīvainu rezultātu, ko tas arī dara.
#include <pthread.h>
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int acquires_count = 0;
int
trylock()
{
int res;
res = pthread_mutex_trylock(&mutex);
if (res == 0) {
++acquires_count;
}
return res;
}
Kompilēšanas rezultāts ir ekvivalents šādam kodam:
int
trylock()
{
int res;
int tmp;
res = pthread_mutex_trylock(&mutex);
tmp = acquires_count;
if (res == 0) {
++tmp;
}
acquires_count = tmp;
return res;
}
EPIC FAIL!
Palīdzēt var ar volatile vai skaitītāja palielināšanu liekot citā funkcijā. Bet svarīgi atcerēties, ka vairākpavedienu programmās būs jācīnās ne tikai ar algoritma kļūdām, paralēlu izpildi gan vairāku procesoru, gan viena procesora out-of-order izpildes līmenī, procesora spekulācijām, bet arī ar kompilatora optimizācijām.