<b>#include <Ρthread.h></b><b>int pthread_mutex_init(pthread_mutex_t* mutex,</b><b>Β const pthread_mutexattr_t *mutexattr);</b><b>int pthread_mutex_lock(pthread_mutex_t* mutex);</b><b>int pthread_mutex_unlock(pthread mutex_t* mutex);</b><b>int pthread_mutex_destroy(pthread_mutex_t *mutex);</b>ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ 0 ΠΈ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
errnoΠΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ², ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠΏΠ°
pthread_mutex_tpthread_mutex_initpthread_mutex_lockΠ£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΌΡΡΡΠ΅ΠΊΡΠ° Π² ΡΡΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ
NULLpthread_mutex_initΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.4.Β
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ thread1.Ρ, Π½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Π°Ρ. ΠΠ° ΡΡΠΎΡ ΡΠ°Π· Π²Ρ ΡΠ΄Π΅Π»ΠΈΡΠ΅ ΠΎΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΡ ΠΊ Π²Π°ΡΠΈΠΌ Π²Π°ΠΆΠ½ΡΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΠ΅ ΠΌΡΡΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ. ΠΠ»Ρ Π»Π΅Π³ΠΊΠΎΡΡΠΈ ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΡ ΠΏΡΠΎΠΏΡΡΡΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΠΈΠ· ΠΌΡΡΡΠ΅ΠΊΡΠ°, Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ. Π ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ Π½ΠΎΠ²ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ thread4.c.
#includeΒ <stdio.h>#includeΒ <unistd.h>#includeΒ <stdlib.h>#includeΒ <string.h>#includeΒ <pthread.h>#includeΒ <semaphore.h>void *thread_function(void *arg);pthread_mutex_t work_mutex;Β /* Π·Π°ΡΠΈΡΠ°Π΅Ρ work_area ΠΈ time_to_exit */#define WORK_SIZE 1024char work_area[WORK_SIZE];int time_to_exit = 0;int main() {Β int res;Β pthread_t a_thread;Β void *thread_result;Β res = pthread_mutex_init(&work_mutex, NULL);Β if (res != 0) {Β perror("Mutex initialization failed");Β Β exit(EXIT_FAILURE);Β }Β res pthread_create(&a_thread, NULL, thread_function, NULL);Β if (res != 0) {Β perror("Thread creation failed");Β Β exit(EXIT_FAILURE);Β }Β pthread_mutex_lock(&work_mutex);Β printf("Input same text. Enter 'end' to finish\n");Β while (!time_to_exit) {Β fgets (work_area, WORK_SIZE, stdin);Β Β pthread_mutex_unlock(&work_mutex);Β Β while(1) {Β Β pthread_mutex_lock(&work_mutex);Β Β if (work_area[0] != '\0') {Β Β Β pthread_mutex_unlock(&work_mutex);Β Β Β sleep(1);Β Β } else {Β Β Β break;Β Β }Β }Β }Β pthread_mutex_unlock(&work_mutex);Β printf("\nWaiting for thread to finish...\n");Β res = pthread_join(a_thread, &thread_result);Β if (res ! = 0) {Β perror("Thread join failed");Β Β exit(EXIT_FAILURE);Β }Β printf("Thread joined\n");Β pthread_mutex_destroy(&work_mutex);Β exit(EXIT_SUCCESS);}void *thread_function(void *arg) {Β sleep(1);Β pthread_mutex_lock(&work_mutex);Β while(strncmp("end", work_area, 3) ! = 0) {Β printf("You input %d characters\n", strlen(work_area)-1);Β Β work_area[0] = '\0';Β pthread_mutex_unlock(&work_mutex);Β Β sleep(1);Β pthread_mutex_lock(&work_mutex);Β Β while (work_area[0] == '\0') {Β Β pthread_mutex_unlock(&work_mutex);Β Β sleep(1);