Archief - [PROG]ansi c & multi-threading

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

dj insulin

Legacy Member
ik ben een programma aan het ontwerpen om als benchmark te dienen voor de zgn dual-cores. Ik moet daarvoor mijn programma multi-threaded schrijven.
Ik wil een ansi-c multi-threading, zodat ik het later kan porten naar unix. Heeft er iemand een idee hoe ik dit moet doen? het breekpunt ziet er zo uit:

for(unsigned long long index = 0; index <= maxTemp; index += 2)
{
printf(%e, testfunctie(index));
printf(%e, testfunctie(index++);
}
ik wil dus dat het programma voor de functie testfunctie() een nieuwe thread maakt. Deze thread moet dan de waarde (een double) teruggeven aan de main functie. Heeft er iemand een idee hoe ik dit moet implementeren zodat de threads door het os over beide cores worden gespreid en ik platformonafhankelijk blijf?

dj insulin

Legacy Member
wegens wat fouten in de structuur heb ik al het een en het ander aangepast, dit is nu de betreffende for-lus:
for(unsigned long long index = 1; index <= maxTemp, index += 4)
{
waarde1 = testfunctie(index);
waarde2 = testfunctie(index+2);
if (waarde1 < 0.0)
{
printf("%Le \n", waarde1);
aantal++;
}
if (waarde2 < 0.0)
{
printf("%Le \n", waarde2);
aantal++;
}
}
dit omdat de even getallen niet mee mogen doen, en omdat ik de computer wou laten bijhouden hoeveel keer er een getal naar het scherm wordt geschreven. Ik heb in de functie testfunctie() geschreven dat de return-waarde -1 moet zijn indien ze voor de parameter index geen resultaat vindt. Nu alleen het principe van multi-threading nog. Kan iemand mij helpen?

killgore

Legacy Member
dus als ik het goed begrijp moet hij ipv testfunctie 1 2x na mekaar te doen deze 2x tegelijk doen, maar in de main prog wel stoppen aangezien je daar moet wachten tot waarde1 & 2 berekend zijn?

threads die waarden gaan returnen zijn gevaarlijk hoor :p, omdat het principe van een thread eigenlijk juist is: start dat ding op, maar ga ondertussen door met iets anders & wacht niet op resultaat. :)

wlibaers

Legacy Member
En vergeet dat platformonafhankelijke deel maar, threading is geen deel van standaard C. Op Unix gebruik je POSIX threads, op Windows de Win32 API threads. De principes zijn wel vergelijkbaar, maar je zal toch wat dingen moeten aanpassen.

killgore

Legacy Member
wlibaers zei:
En vergeet dat platformonafhankelijke deel maar, threading is geen deel van standaard C. Op Unix gebruik je POSIX threads, op Windows de Win32 API threads. De principes zijn wel vergelijkbaar, maar je zal toch wat dingen moeten aanpassen.
mja

je kan wel een systeempje maken dat bij verschillende compiles verschillende libs aanspreekt he ;). Algemeen threadingsysteem dat os-specifieke threadingsystemen aanspreekt. Kheb iets soortgelijke voor verschillende window-systemen aan te spreken, kleine compileroptie en ik switch tussen bv. SDL & winapi ;).

dj insulin

Legacy Member
valt er dan niks te regelen met bv de preprocessor? bijvoorbeel dat adhv de compliler hij een aantal regels wijzigt? die waarde moet ik wel zowieso terug in main() hebben, daar is geen weg rond (of ik zie iets over het hoofd)

dj insulin

Legacy Member
en op het probleem dat main zal stoppen na de 2de testfunctie():
ik heb eigenlijk maar 1 functie nodig, want ik wil maar 2 threads, en de 2de testfunctie kan door de cpu die main berekent zelf uitgerekend worden

wlibaers

Legacy Member
killgore zei:
mja

je kan wel een systeempje maken dat bij verschillende compiles verschillende libs aanspreekt he ;). Algemeen threadingsysteem dat os-specifieke threadingsystemen aanspreekt. Kheb iets soortgelijke voor verschillende window-systemen aan te spreken, kleine compileroptie en ik switch tussen bv. SDL & winapi ;).

Dan zou je meteen de ingebouwde threading functies van SDL kunnen toepassen. Of gewoon de pthreads port voor Windows gebruiken.
http://sourceware.org/pthreads-win32/
Merk wel op dat POSIX optionele delen bevat, en niet elke pthreads lib zal alle functies hebben. Maar de belangrijkste wel.

Wat wachten betreft:
http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_join.html

dj insulin

Legacy Member
ik heb ondertussen ook het een en het ander gevonden: Ik maak gebruik van de cheap_threads api, die beweert te zijn geschreven onder ansi c en dus platformonafhankelijk
link: http://home.swbell.net/mck9/ct/

nu zit ik wel met een probleem: de syntax is volledig correct (of toch bijna)
de linker geeft echter een error bij alle multi-threading functies die ik oproep:
'undefined reference to (functie)'
de .h file is zeker gevonden, want als ik de naam van de header verander klaagt de syntax checker al dat het niet werkt
ik heb een vermoeden dat het in de .h file zelf zit. In de de readme vond ik het volgende:

Standard Cheap Threads
Standard Cheap Threads is designed for a hosted implementation of Standard C. In particular it uses dynamic memory allocation (malloc and free) and it writes messages to standard error. For standard Cheap Threads, use the following combination of modules:

* ctalloc.c
* ctassert.c (optional; for debugging only)
* cterror.c
* ctmemory.c
* ctmsg.c
* ctsched.c
* ctsubscr.c

maar waar moet ik die .c files dan invoegen? Gewoon met #include ?
In de .h file of in de source van het programma?
PS: ik heb een voorbeeldprogramma van cheap threads (source kwam mee met de zip-file) gecompileerd en het gaf juist hetzelfde resultaat (een error). weet iemand hoe je modules moet invoegen als de omgeving ervan pas geïnitialiseerd wordt in een header?

wlibaers

Legacy Member
Linkers klagen niet over headerbestanden. Wat je moet doen is al die bestanden compileren en mee in het project linken (of er een library van maken en die linken). De methodes om dit te doen verschillen voor verschillende compilers en linkers, bekijk dus de documentatie.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan