c multitasking

Sekcia: Programovanie 06.10.2011 | 19:43
Avatar Zer0 Slackware 13.37  Používateľ
Zdar. Je mozne v c-ku spustit 2 ulohy naraz a to v jednom programe mam na mysli nieco take aby program cital vstup z klavesnice a popritom cital znaky aj zo suboru ale musi to robit naraz ? Proste aby isli 2 ulohy paralelne.
    • Re: c multitasking 06.10.2011 | 20:25
      Avatar Grawp   Používateľ
      man fork
      • Re: c multitasking 06.10.2011 | 23:15
        Avatar Fridolín Pokorný Fedora 21  Používateľ
        + POSIX threads
        • Re: c multitasking 06.10.2011 | 23:48
          Peter S.   Návštevník
          ale posix threads je problem skompilovať na windowsoch,

          alternatíva môže byť glib threading:
          http://www.yolinux.com/TUTORIALS/GDK_Threads.html
          • Re: c multitasking 06.10.2011 | 23:56
            Avatar m4jkl   Používateľ
            no priznavam sa, ze som to nikdy nepotreboval = netestoval. ale viem, ze existuje projekt pthreads-w32:

            http://sourceware.org/pthreads-win32/
            http://en.wikipedia.org/wiki/POSIX_Threads#POSIX_Threads_for_Windows
            • Re: c multitasking 07.10.2011 | 00:02
              Peter S.   Návštevník
              Ja do toho až tak nevidím, programy pre windows ani neviem kompilovať, ale tak mi bolo povedané. Možno to nie je až také vyhranené...


            • Re: c multitasking 07.10.2011 | 00:13
              Avatar borg Arch, Debian jessie  Administrátor
              win port nepodporuje vsetko.
              • Re: c multitasking 07.10.2011 | 00:15
                Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                Ale funguje pomerne dobre, ak clovek pouziva zakladne veci (thready, mutexy, semafory). Prvykrat som pthreads-win32 pouzil v 2003 a odvtedy to pouzivam skoro vkuse a nemal som zatial ziaden problem.
                Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
              • Re: c multitasking 07.10.2011 | 00:35
                Avatar Fridolín Pokorný Fedora 21  Používateľ
                Vzdy lepsie nez fork(), ktory na win neexistuje, teda existuje ekvivalent create_process(). Kazdopadne nezmienil pre co to pise a na co konkretne to potrebuje - ci uprednostnit vlakna/procesy.
                • Re: c multitasking 07.10.2011 | 00:36
                  Avatar Fridolín Pokorný Fedora 21  Používateľ
                  Pardon, CreateProcess().
                • Re: c multitasking 07.10.2011 | 12:40
                  Avatar borg Arch, Debian jessie  Administrátor
                  preco je fork() lepsi, lebo mrha viac zdrojmi ako CreateProcess()?
                  • Re: c multitasking 07.10.2011 | 13:08
                    Avatar m4jkl   Používateľ
                    on nepisal, ze fork() je lepsi. takze klud, na tvoj CreateProcess() ti nikto nesiaha :)

                    btw. co myslis tym, ze viac mrha zdrojmi?
                    • Re: c multitasking 07.10.2011 | 13:28
                      Avatar borg Arch, Debian jessie  Administrátor
                      ja som sa len pytal, nemusis nikoho ukludnovat.
                  • Re: c multitasking 08.10.2011 | 16:40
                    Avatar Fridolín Pokorný Fedora 21  Používateľ
                    Asi sa nechapeme. Ja som to uz zdovodnil v poste.
    • Re: c multitasking 06.10.2011 | 20:25
      someone   Návštevník
      fork ?
      • Re: c multitasking 06.10.2011 | 20:26
        someone again   Návštevník
        ok, tak man fork... grawp bol rychlejsi :D
        • Re: c multitasking 06.10.2011 | 20:52
          Avatar Zer0 Slackware 13.37  Používateľ
          :D A mohli by ste o tom viac popisat neviem ci som to dobre pochopil :D
          • Re: c multitasking 07.10.2011 | 01:03
            Avatar Grawp   Používateľ
            Funkciou fork sa klonujú procesy. Fork je jediná funkcia, ktorá vracia hodnotu dvakrát, raz v rodičovskom procese, raz v dieťati.

            Použitie:
            pid_t x = fork();
            if (x == -1) {
            cout << "Chyba" << endl;
            else if (x == 0) {
            //kod dieťaťa
            } else {
            //kod rodiča
            }

            Okrem toho existuje ešte aj funkcia exec. Voláva sa na začiatku života dieťaťa. Dieťa vykuchá a nacpe doňho spustitelný kód zo súboru.
            • Re: c multitasking 08.10.2011 | 00:40
              Avatar Zer0 Slackware 13.37  Používateľ
              Takze ten rodicovsky a detsky proces bezia paralelne napriek tomu ze je tam to if ?
              • Re: c multitasking 08.10.2011 | 01:06
                Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                Ano, od zavolania funkcie fork sa ten proces "rozmnozi", teda sa skopiruje pamat a z jedneho procesu sa stanu dva. Vdaka tomu if vies, v ktorom z tych dvoch procesov si. Ci v povodnom (rodic), alebo v tej kopii (potomok).
                Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
                • Re: c multitasking 08.10.2011 | 01:26
                  Peter S.   Návštevník
                  no ale ked to beží v dvoch procesoch, je nejako riešené aj vrátenie nejakých vypočítaných hodnôt do "hlavného" procesu?

                  Lebo ked máš thready, tak (tie thready) stále môžu brať a ukladať hodnoty z/do statických premenných, alebo jednoducho vrátiť nejakú hodnotu do "hlavného" procesu...

                  Vlastne si myslím že fork-ing a threading sú dosť rozdielné veci..
                  • Re: c multitasking 08.10.2011 | 01:36
                    Avatar Samuel BWPOW Kupka CentOS, Mandriva  Používateľ
                    Ano, su to rozdielne veci. Pamat medzi procesmi nie je zdielana, ale samozrejme existuju mechanizmy medziprocesovej komunikacie. Tu je celkom fajn prehlad: Linux Interprocess Communications. Osobne dost casto vyuzivam System V IPC. Ked si na to clovek trochu zvykne, tak je to lahoda :)

                    V tomto pripade si ale myslim, ze riesenie cez thready by bolo ovela jednoduchsie, prave kvoli tomu, ze povodny zadavatel otazky je v tejto oblasti novacik.
                    Strach dát najevo své pocity a zjednat si u druhých respekt je jedním z problémů civilizovaného člověka, který se naučil zpochybňovat svou vlastní pravdu pro zdání objektivity
                    • Re: c multitasking 08.10.2011 | 15:32
                      Avatar Grawp   Používateľ
                      Si ma predbehol.
                  • Re: c multitasking 08.10.2011 | 15:31
                    Avatar Grawp   Používateľ
                    Ano sú to rozdielne veci. Fork je docela náročný, musi sa replikovať celý process control block a všetky ostatné potrebné štruktúry. Pri threadoch sa vytvorí iba viac stackov pre vlákna, PCB zostáva ten istý. (Možete ma doplniť, s threadmi som ešte nerobil.

                    Na IPC:
                    Message queues
                    Semaphores
                    Shared memory
                    Reading, writing, and locking files
                    Signals
                    Sockets
                    Pipes
                    FIFOs (First In, First Out)
    • Re: c multitasking 08.10.2011 | 04:12
      johnny   Návštevník
      Nazýva sa to, že vlákna(threads).
      Na začiatok ti odporúčam prečítať:
      http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
      Možno sa potom dostať aj ku kritickým oblastiam ktoré pri viac-vláknových programoch vznikajú. A potom možno prečítať niečo aj ako mutex vs. spinlock vs iné,aby si vedel kedy čo použiť...
      http://www.alexonlinux.com/pthread-spinlocks
      http://www.alexonlinux.com/pthread-mutex-vs-pthread-spinlock