Multithreading

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.

3 Responses to “Multithreading”

  1. marrtins says:

    Programmēt multi-threadus Erlang salīdzinoši ir medusmaize :)

  2. Aivars says:

    Marrtins: jo Erlang nav vairāku pavedienu (multi-threading)? Tur ir procesi, kas apmainās ziņojumiem un tāpēc nav kopēja stāvokļa (shared state). Tāpat var darīt arī C++ un citās valodās. Tas gan neglābj no problēmām ar kopējiem failiem un datubāzi, bet tas ir cits stāsts.

  3. Cheap Meds says:

    I usually don’t post in blogs but your blog forced me to, amazing work.. beautiful !

Leave a Reply

You must be logged in to post a comment.