Permalänk
Medlem

c++ threads

Halloj...

Någon här som kan något om trådar?
Jag kan tyvärr inte ett skvatt....

Har hört att det är en del att hålla koll på gällande trådar osv, men det jag vill ha är en lösning på detta:

.... min ordinarie kod.... { // detta är mitt önskade threadblock Här kommer jag att ha några väldigt känsliga anrop, som kan ta väldigt lång tid om något är fel. Generellt så ska det vara lungt men datorn som kör detta får inte stanna upp alls. } ... min ordinarie kod igen...

jag vet inte hur jag borde lösa detta....
Mene... det kändes som om en tråd kanske kan göra så att inte programmet stannar upp....

Jag vet inte alls hur man arbetar med trådar, men det kanske någon av er har koll på?

Mer än så behöver jag inte göra med min tråd...

Permalänk
Medlem

Vilken plattform kodar du för?
Trådar är nämligen väldigt plattformsberoende, och hur man skapar dem skiljer sig från OS till OS och kompilator till kompilator. Tror inte att Unix ens har stöd för trådar utan har istället något som kallas lättvikts processer, men det är typ sak samma.

EDIT: Generellt så är det ganska så okomplicerat att skapa en tråd, det som kan bli bökigt är om trådarna behöver dela på resurser (variabler o liknande). Då måste du hantera detta med lås och såvidare.

Visa signatur

5D MkII

Permalänk
Hedersmedlem

vectrex: Linux har iaf stöd för trådar.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Flera trådar fungerar på samma sätt som flera olika applikationer, skillnaden är att de arbetar inom samma minnesblock (?). Och det man måste hålla reda på är att när de läser/skriver till en plats i minnet (variabel) som kan nås av de andra trådarna så får de inte läsa/skriva samtidigt, då kan resultatet bli väldigt fel.

Men generellt sätt så är det så här (i Windows då):

enfunktion() { // en massa kod, loopar eller vad du nu vill ha } int main() { CreateThread(..., enfunktion, ...); // mer kod, loopar osv... }

Vid CreateThread så skapas en funktion med ingångsfunktionen enfunktion (ungefär som om du skulle få välja någon annan funktion istället för int main() ).
Sen använder man mutexar för att inte skriva/läsa till samma variabel samtidigt.

Ush vad jag flummar känner jag, hoppas du kan tyda det.

Permalänk
Medlem

jag pratar om windows

jag tyckte det där kändes som en bra förklaring...

hur fungerar mutexar då?

Men då mina anrop och variabler som kommer att användas i den nya tråden kommer att arbeta med helt andra saker än min standardtråd, behöver jag bry mig i nåt annat då?

Eller räcker det där lilla?

Men om det finns mer relevanta detaljer, berätta gärna...

Permalänk
Medlem

Mutexar fungerar så att först skapar man dem på något sätt, sen innan man ska använda en viss variabel som skulle kunna användas av någon annan tråd så säger man till att man börjar använda en viss mutex, används den redan av en annan tråd så pausas den tråden till mutexen blir "ledig". Ungefär som en stafettpinne, det finns bara en stafettpinne och den som håller i den får läsa/skriva till variabeln.

Vet inte kommandona för mutexarna men tror att några är CreateMutex() och ReleaseMutex().

Permalänk
Medlem

okay, coolt.... trådar verkar intressanta...

Tack för hjälpen och tipsen!

Kommer att återkomma till denna tråd igen ikväll för att se om folk tillägger nåt

Permalänk

HJÄLP.......

var kan jag få fatt i C++??

Visa signatur

// Buse :)

Permalänk
Medlem

Re: HJÄLP.......

Citat:

Ursprungligen inskrivet av Insane Clown
var kan jag få fatt i C++??

På Internet!

Visa signatur

War is Peace.
Freedom is Slavery.

Permalänk
Medlem

Boost har ett lib för portabla trådar:
http://www.boost.org/doc/html/threads.html
Verkar vara rätt bra, och plattformsoberoende e ju aldrig fel även om pratar om windows som nr1. Iof kanske du redan letat rätt på det själv?

Mer generellt: Om man använder trådar så behöver alla funktioner man anropar vara trådsäkra, även standardfunktionerna. Tex nämner boost-sidan rand som ett exempel på en icke-säker funktion. Dumma saker som kan hända är om 2 trådar försöker läsa/skriva till samma minnesbit samtidigt, då vet man inte riktigt vad som kan hända, och rand har visst ett state som gäller för alla rand-anrop och är därför inte garanterat säkert.

Så lite jobb kan man behöva göra även om man bara vill ha 2 trådar som inte behöver samarbeta på något sätt, speciellt i ett språk med sidoeffekter. Iof kanske sånt löser sig automatiskt om man använder windows-trådar..

Permalänk
Medlem

hmm, tack för det inlägget...

jag ska se senare vad som händer... dröjer nog ett par dagar till innan jag kan implementera min lilla tråd...

Permalänk
Glömsk

Trådar är en sån där grej du inte bör läsa om så mycket eftersom det kommer göra dina fingrar förvirrade. Bara man vet exakt vad en tråd är så kan fingrarna lösa de problem som uppstår. Gör inte fingrarna förvirrade!

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av vectrex
Vilken plattform kodar du för?
Trådar är nämligen väldigt plattformsberoende, och hur man skapar dem skiljer sig från OS till OS och kompilator till kompilator. Tror inte att Unix ens har stöd för trådar utan har istället något som kallas lättvikts processer, men det är typ sak samma.

EDIT: Generellt så är det ganska så okomplicerat att skapa en tråd, det som kan bli bökigt är om trådarna behöver dela på resurser (variabler o liknande). Då måste du hantera detta med lås och såvidare.

De flesta plattformar har stöd för posix och p-threads.
Så nej trådarning brukar inte vara plattformsberoende om man inte ser till undantaget MS som vägrar att stödja p-threads. Det går dock fint med cygwin....

Visa signatur
Permalänk
Medlem
Permalänk
Medlem

OT: haha, du hade rolig signatur dyluck

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Dyluck
jo men inte native, http://sources.redhat.com/pthreads-win32/

Det var ju det jag skrev, lol

Visa signatur
Permalänk
Medlem

Re: c++ threads

Det första att säga om trådar är att de inför en helt ny dimension av groteskt otäcka buggar. Att undvika trådar mår man nästan alltid bra av. Om man inte kan undvika trådar (eller är nyfiken) så kan det vara en idé att kolla in kapitel 11 i Bruce Eckels Thinking in C++, 2nd edition. En rolig sak med trådar (eller lättviktsprocesser) är att de implementeras på användarnivå snarare än kernelnivå, om det nu inte rör sig om kerneltrådar. I Bruce Eckels bok används zthread. Jag har inte provat det själv, men det är säkert bara fint. zthread är åtminstone enligt dess egen hemsida plattformsoberoende.

Visa signatur

(http://rivfader.blogspot.com)
Blank face in the windowpane
Made clear in seconds of light

Permalänk
Medlem

Precis som de flesta tidigare har skrivit så är trådar en källa till fel.
Segmentationsfel, deadlocks mm hör till vanligheten om man inte har tungan rätt i munnen

Du har säkert redan läst om hur du använder mutex ihop med trådarna.
Förklarar lite av det endå om det är nån annan som är intresserad.

Jag har använt mutex i de fall flera trådar skall kunna accessa samma objekt, och där ett contentswitch skulle bli ett fatalt fel.

Eftersom OS styr vad som ska köras kan man i förväg inte förutse när dessa contentswitch sker. Här kommer mutex in i bilden för att kunna förhindra att detta sker innan en kritisk sektion har körts klart.

Ex.

---- kod som inte är kritisk ----

mutex_lock();
--- Kritisk kodsektion ---
Här kommer alltså allt köras innan annan tråd körs.
mutex_unlock();

---- kod som inte är kritisk ----

Detta får till följd att den kritiska sektionen körs klart innan nått annat i programmet körs, oavsett om det finns fler olika trådar som körs parallellt i programmet.

Detta kan dock få till följd om man inte är försiktig att programmet inte går vidare, dvs. Deadlock.

Hur sedan API:erna är är lite olika beroende på plattform som sagt.

Jag garderar mig för eventuella fel

/DT

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av totoo
OT: haha, du hade rolig signatur dyluck

tack

Citat:

Ursprungligen inskrivet av RibBones
Det var ju det jag skrev, lol

Att man måste använda cygwin i win för att få en POSIX thread implementation?, detta är ett lib som fungerar med native win32 mjukvara...dvs utan cygwin.

http://sources.redhat.com/pthreads-win32/faq.html

How do I use pthread.dll for Win32 (Visual C++ 5.0) You should have a .dll, .lib, .def, and three .h files. It is recommended that you use pthreadVC.dll, rather than pthreadVCE.dll or pthreadVSE.dll (see Q2 above). blablalbla... (more)