Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Useampi säie saman prosessin sisällä

jone2712 [28.02.2018 17:48:14]

#

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.

peran [28.02.2018 17:58:51]

#

Onko tästä mitään apua ?

http://www.cplusplus.com/reference/thread/thread/

jone2712 [28.02.2018 18:58:43]

#

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ä.

peran [28.02.2018 19:17:21]

#

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.

Metabolix [01.03.2018 18:51:46]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta