Vuosia sitten luin jostakin, miten useampi säie luodaan wintoosassa saman prosessin sisään. Tekemäni ohjelma oli simppeli. Toinen esimerkkisäie kasvatti muuttujaa ja toinen pääsäie tulosti sitä. Miten tuo taas menikään, kun olen hukannut varmuuskopion.
Onko tästä mitään apua ?
Borland C++ 5.02:ssa ei ole kirjastoa:
#include <thread>
Ja vuosia sitten tekemäni koodinpätkä toimi myös BC 5.02:ssa. Seuraavanlainen koodi pitäisi saada toimimaan:
#include <stdio.h> int x=0; void print(void) { printf("%d\n", x); } void inc_x(void) { ++x; } void main(void) { // inc_x-säikeen käynnistys for (;;) { print(); } }
Ajatuksena on, että prosessi hyödyntäisi useampia prosessorin ytimiä.
Minkähän takia koodisi pitäisi toimia viime vuosituhannen kääntäjällä ?
Lisäys:
Tässä erittäin ruma ja buginen versio ongelmastasi...
En jaksanut laittaa lukkoja kirjoitukseen, joten jossain tapauksessa saattaa koodini tehdä ikävää, mutta käyneen esimerkistä.
Lähde:
#include <iostream> #include <thread> #include <unistd.h> using namespace std; int x; void echo(int *x) { while (1) { std::cout << *x; std::cout << "\n"; usleep(300000); } } void add(int *x) { while(1) { (*x)++; usleep(5000000); } } int main(int argc, char **argv) { x=0; thread first (add,&x); thread second (echo,&x); std::cout << "Ajaa kolmatta ja pää säiettä\n"; first.join(); second.join(); return 0; }
Kääntyy linuksissa:
g++ hellothread.cpp -lpthread -o hellothread
Huomioitavaa myös, ettei join:t koskaan täyty.
Jos on pakottava tarve ohjelmoida ikivanhalla kääntäjällä vain Windowsille, voi käyttää WinAPI-funktiota CreateThread, josta löytyy kyllä netistä esimerkkejä. Muussa tapauksessa kannattaa hankkia nykyaikainen kääntäjä ja käyttää C++:n valmista thread-luokkaa. Kääntäjien optimointitekniikkakin on kehittynyt 20 vuodessa sen verran, että jos monen ytimen käyttö tuntuu tarpeelliselta, luultavasti myös nykyaikaisesta kääntäjästä olisi ohjelman nopeuden kannalta huomattavaa hyötyä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.