Archive for February, 2010

Ko mamma tev nestāstīja par Oracle MERGE priekšrakstu

Friday, February 26th, 2010

Oracle MERGE priekšraksts (jeb upsert) ļauj ar vienu operāciju izmainīt ierakstu vai pievienot to, ja šāds ieraksts vēl neeksistē. Apmēram:

IF ieraksts atrasts
    THEN UPDATE
ELSE
    INSERT;

Kas nav acīmredzams, bet patiesībā loģisks rezultāts: veicot operāciju ar primāro atslēgu “ON” daļā ir iespējams iegūt kļūdu “ORA-00001: unique constraint (…) violated”. Respektīvi – starp brīdi, kad Oracle noskaidro, ka ieraksts neeksistē un veic INSERT, kāds cits process, veicot MERGE operāciju, var paspēt izpildīt INSERT pirmais.

Multithreading

Friday, February 26th, 2010

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.

The World’s Quietest Indian

Tuesday, February 23rd, 2010

“Izdevies” foto.

Daily programming links

Tuesday, February 16th, 2010

Gallery of Processor Cache Effects sevišķi interesants ir 6. piemērs par vairākpavedienu programmām. Nevajag vienu globālu mainīgo, lai programmā radītu šauro vietu – pietiek ar to, ka mainīgie, ko izmanto dažādi pavedieni, atrodas tuvu viens otram atmiņā. Procesoriem būs darba pilnas rokas, sinhronizējot savas kešatmiņas.

Tad vēl fonā klausos Python vs. Ruby: A Battle to The Death, rakstu Lua smilšu kasti un mācu darboties ar Tuxedo datu tipiem.

Überšovs

Tuesday, February 9th, 2010

Tā nu sanāca, ka vakar noskatījos ekstrasensu cīņu finālu. Smieklīgi, ka finālā tika saņemtas tikai 50,000 balsis. Krievijas šovam! Bet es zinu kā šo šovu var padarīt populārāku:

Überšovā vajadzēja piedalīties ekstrasensiem un viņu ģimenēm un dziedāt kopā ar kori no dzimtās pilsētas. Tad ekstrasensam būtu jādejo pārī ar profesionālu dejotāju. To visu jāvērtē 3 cilvēku žūrijai: viens jackass un divi draudzīgi locekļi, ja šovu rādīs pa TV3; trīs draudzīgi un laipni locekļi bez mugurkaula, ja šovu rādīs pa LNT. Piedevām, ekstrasensiem būtu jācīnās par raidījuma vadītāja sirdi un jāpelna sarkanas rozes.

Protams, iznākumu šim šovam var paredzēt uzreiz – uzvarēs tas ekstrasenss, kura dzimtā pilsēta būs Latgalē.