thread_function is running. Argument was 1thread_function is running. Argument was 2thread_function is running. Argument was 3thread_function is running. Argument was 4Bye from 1thread_function is running. Argument was 5Waiting for threads to finish...Bye from 5Picked up a threadBye from 0Bye from 2Bye from 3Bye from 4Picked up a threadPicked up a threadPicked up a threadPicked up a threadPicked up a threadAll doneΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ ΠΈΠΌ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π΅ΡΡΡ ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΠ²ΠΈΡ ΡΠ΅Π±Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΄Π°Π»ΠΈΡΠ΅ Π²ΡΠ·ΠΎΠ² sleep ΠΈΠ· ΡΠΈΠΊΠ»Π°, Π·Π°ΠΏΡΡΠΊΠ°ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΡ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ Π΅Π΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Ρ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΡ Π½Π°ΡΠ»ΠΈ Π΅Π΅? Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄. "ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ" Π±ΡΠ΄Π΅Ρ Π΄Π°Π½ΠΎ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ° ΡΠ΅ΠΉ ΡΠ°Π· Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΡΠΎΠΊΠΎΠ²:
pthread_t a_thread[NUM_THREADS];ΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΠ΅ Π² ΡΠΈΠΊΠ» ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²:
for (lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) {Β res = pthread_create(&(a_thread[lots_of_threads]), NULL,Β thread_function, (void *)&lots_of_threads);Β if (res != 0) {Β Β perror("Thread creation failed");Β Β exit(EXIT_FAILURE);Β }Β sleep(1);}ΠΠ°ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΈ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΆΠ΄ΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π½Π°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:
void *thread_function(void *arg) {Β int my_number = *(int *)arg;Β int rand_num;Β printf("thread_function is running. Argument was %d\n", my_number);Β rand_num = 1+(int)(9.0* rand()/(RAND_MAX+1.0));Β sleep(randnum);Β printf("Bye from %d\n", my_number);Β pthread_exit(NULL);}Π ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ (ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ) ΠΏΠΎΡΠΎΠΊΠ΅ Π²Ρ ΠΆΠ΄Π΅ΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, Π½ΠΎ Π½Π΅ Π² ΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠ°ΠΊΠΎΠΌ Π²Ρ ΠΈΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ:
for (lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0; lots_of_threads--) {Β res = pthread_join(a_thread[lots_of__threads], &thread_result);Β if (res == 0) {Β printf("Picked up a thread\n");Β } else {Β perror("pthread_join failed");Β }}ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±Π΅Π· Π²ΡΠ·ΠΎΠ²Π°
sleepthread_function is running. Argument was 0thread_function is running. Argument was 2thread_function is running. Argument was 2thread_function is running. Argument was 4thread_function is running. Argument was 4thread_function is running. Argument was 5Waiting for threads to finish...Bye from 5Picked up a threadBye from 2Bye from 0Bye from 2Bye from 4Bye from 4Picked up a threadPicked up a threadPicked up a threadPicked up a threadPicked up a threadAll doneΠΡ Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ? ΠΠΎΡΠΎΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ°ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠΈΠΊΠ»Π΅. ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ:
for (lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) {Β res = pthread_create(&(a_thread[lots_of_threads]), NULL,Β thread_function, (void *)&lots_of_threads);ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ
mainlots_of_threadsres = pthread_create(&(a_thread[lots_of_threads]), NULL,Β thread_function, (void *)lots_of_threads);ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ
thread_functionvoid *thread_function(void *arg) {Β int my_number = (int)arg;ΠΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ thread8a.c.
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>