Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Mutex.c





#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

#include <errno.h>

 

static int counter; // shared resource

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 

void incr_counter(void *p) {

do {

usleep(10); // Let's have a time slice between mutex locks

pthread_mutex_lock(&mutex);

counter++;

printf("%d\n", counter);

sleep(1);

pthread_mutex_unlock(&mutex);

} while (1);

}

 

void reset_counter(void *p) {

char buf[10];

int num = 0;

int rc;

pthread_mutex_lock(&mutex); // block mutex just to show message

printf("Enter the number and press 'Enter' to initialize the counter with new value anytime.\n");

sleep(3);

pthread_mutex_unlock(&mutex); // unblock blocked mutex so another thread may work

do {

if (gets(buf)!= buf) return; // NO fool-protection! Risk of overflow!

num = atoi(buf);

if ((rc = pthread_mutex_trylock(&mutex)) == EBUSY) {

printf("Mutex is already locked by another process.\nLet's lock mutex using pthread_mutex_lock().\n");

pthread_mutex_lock(&mutex);

} else if (rc == 0) {

printf("WOW! You are on time! Congratulation!\n");

} else {

printf("Error: %d\n", rc);

return;

}

counter = num;

printf("New value for counter is %d\n", counter);

pthread_mutex_unlock(&mutex);

} while (1);

}

 

int main(int argc, char ** argv) {

pthread_t thread_1;

pthread_t thread_2;

counter = 0;

 

pthread_create(&thread_1, NULL, (void *)&incr_counter, NULL);

pthread_create(&thread_2, NULL, (void *)&reset_counter, NULL);

 

pthread_join(thread_2, NULL);

return 0;

}

[скачать]

Данный пример демонстрирует совместный доступ двух потоков к общей переменной. Один поток (первый поток) в автоматическом режиме постоянно увеличивает переменную counter на единицу, при этом занимая эту переменную на целую секунду. Этот первый поток дает второму доступ к переменной count только на 10 миллисекунд, затем снова занимает ее на секунду. Во втором потоке предлагается ввести новое значение для переменной с терминала.

Если бы мы не использовали технологию «мьютекс», то какое значение было бы в глобальной переменной, при одновременном доступе двух потоков, нам не известно. Так же во время запуска становится очевидна разница между pthread_mutex_lock() и pthread_mutex_trylock().

Компилировать код нужно с дополнительным параметром -lpthread:

$ gcc -o mutex -lpthread mutex.c


Запускаем и меняем значение переменной просто вводя новое значение в терминальном окне:

$./mutex

Enter the number and press 'Enter' to initialize the counter with new value anytime.

30 <Enter> <--- новое значение переменной

Mutex is already locked by another process.

Let's lock mutex using pthread_mutex_lock().

New value for counter is 30

1 <Enter> <--- новое значение переменной

Mutex is already locked by another process.

Let's lock mutex using pthread_mutex_lock().

New value for counter is 1

 

Date: 2015-07-01; view: 438; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию