if ( /* Π½Π΅ΡΡΠΎ */ ) {
Β // static ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠ°Π·ΡΡΡΠ°Π΅ΠΌΠΎΡΡΡ
Β static struct DataParam copy;
Β copy = data;
Β pthread_create(NULL, &attr, &ThreadProc, &copy);
}
ΠΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ½ΠΎΠ³Π΄Π° Ρ ΠΎΡΠΎΡΠΎ Β«ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΒ» Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ ΡΠΈΠΏΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΡΡΠΎΠΊ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ ΡΠ·ΡΠΊΠ° Π‘ (ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ½ Π½Π΅ ΡΠ°ΡΡΠΎ):
void* ThreadProc(void *data) {
Β ...
Β // ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ Π΄Π΅Π»Π°ΡΡ ΠΊΠΎΠΏΠΈΡ - ΡΡΠΎ ΡΠΆΠ΅ ΠΊΠΎΠΏΠΈΡ:
Β printf("%s", (char*)data);
}
...
while (true) {
Β char *data = ... /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
*/;
Β if ( /* Π½Π΅ΡΡΠΎ */ )
Β pthread_create(NULL, &attr, &ThreadProc, strdup(data));
}
2. ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΊΠ°Π»ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (
char
short
int
// ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°:
void* ThreadProc(void* data) {
Β // ... Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° (char)data
Β return NULL;
}
// ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΈ ΠΊΠΎΠ΄:
while (true) {
Β char data = /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° */;
Β if ( /* ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π½Π΅ΡΡΠΎ */ )
Β pthread_create(NULL, &attr, &ThreadProc, (void*)data);
}
ΠΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΡΠ°ΠΊ:
pthread_create(NULL, &attr, &ThreadProc, (void*)5);
pthread_create(NULL, &attr, &ThreadProc, (void*)(x + y));
ΠΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½ΠΎΠΉ ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ (ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡΡΠ°Π΅ΡΡΡ ΡΡΡΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΠΌ) ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π²
ThreadProc()
ThreadProc()
3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΠΏΠΎΡΠΎΠΊΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΡΠ³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΠΊΠ°:
void* ThreadProc(void *data) {
Β // ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ data Π±Π΅Π· ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ...
Β ...
Β delete data;
Β return NULL;
}
...
if ( /* Π½Π΅ΡΡΠΎ */ ) {
Β // ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ
Β // (ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, ΡΡΠΎ Π΄Π»Ρ DataParam ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½
Β // ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ):
Β pthread_create(NULL, &attr, &ThreadProc, new DataParam(data));
}
ΠΡΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ Π±Π΅Π·ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ Π΅Π³ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ½ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅ (ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅), Π° ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π² Π΄ΡΡΠ³ΠΎΠΉ (ΠΏΠΎΡΠΎΠΌΠΊΠ΅), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ°ΠΉΠ»Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π° ΠΎΡΠΈΠ±ΠΊΠΈ Ρ ΠΏΠ°ΡΠ½ΠΎΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄ΡΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΡΠΎΠ³ΠΎ.
4. Β«Π ΡΡΠ½ΠΎΠΉΒ» Π²ΡΠ·ΠΎΠ² Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΈ Π΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ QNX β round-robin:
if ( /* Π½Π΅ΡΡΠΎ */ ) {
Β pthread_create(NULL, &attr, &ThreadProc, &data);
Β sched_yield();
}
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠ΅ΠΌ Π½Π°ΡΡΡΠΈΠ»ΠΈ Π±Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ) ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
sched_yield()
Π ΡΡΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΡΠ°ΡΠ΅Π»Ρ Π²ΠΏΡΠ°Π²Π΅ ΠΎΠΆΠΈΠ²ΠΈΡΡΡΡ: Β«ΠΠ±ΠΌΠ°Π½ΡΠ²Π°ΡΡ, ΠΎΠ±Π²Π΅ΡΠΈΠ²Π°ΡΡβ¦Β». ΠΠ°, ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠΊΠ·ΠΎΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π²ΡΠ΅Π³ΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π. ΠΠ΅ΠΉΠΊΡΡΡΡ Β«ΡΠ»Π°Π±ΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²Β» ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΠΎΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΊΠΎΡΠΎΡΡΠ΅ΠΉ: Π² SMP-ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΡΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ², Π±ΠΎΠ»ΡΡΠ΅ΠΌ, ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ Π΅ΠΌΡ ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ. ΠΠΎ ΠΊ Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΊΠΎΠ΅ Β«ΡΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²Β» ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΠΈΠ±ΠΎ ΡΠΈΡΡΠΎ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΌΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ, Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ Π½Π° ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π·ΡΠ°Ρ SMP, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ Π΄Π΅ΡΡΡΠΊΠΈ ΠΈ ΡΠΎΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ²β¦, Π½ΠΎ Π³Π΄Π΅ QNX, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΌ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ.
Π ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΈ Π² ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ:
void* ThreadProc(void *data) {
Β struct DataParam copy(*data);
Β sched_yield();
Β ...
}
ΠΠ½ΠΎΠ³Π΄Π° Π΄Π»Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈ ΡΠ°ΠΊΠ°Ρ, Π² ΠΎΠ±ΡΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΡΠ΅ΠΆΠ½Π°Ρ, ΡΠΎΡΠΌΠ° Π·Π°ΠΏΠΈΡΠΈ:
pthread_create(NULL, &attr, &ThreadProc, &data);
delay(1); // Π²ΠΌΠ΅ΡΡΠΎ sched_yield()
Π€ΠΎΠΊΡΡ Π·Π΄Π΅ΡΡ ΡΠΎΡΡΠΎΠΈΡ Π½Π΅ Π² ΡΠΎΠΌ, ΡΡΠΎ 1 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π° β ΡΡΠΎ Π²ΡΠ΅ΠΌΡ, Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ Π΄Π»Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π΄Π°Π½Π½ΡΡ , Π° Π² ΡΠΎΠΌ, ΡΡΠΎ POSIX ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
delay()
sleep()
nanosleep()