/************* korzystanie z semaforów ******************************
deklaracje w pliku semaphore.h
sem_t - typ semaforowy
sem_init(sem_t* s,0,wartość_semafora) - inicjowanie wartością początkową semafora
sem_post(sem_t* s) - operacja signal
sem_wait(sem_t* s) - operacja wait
**************************************************************/
/************* korzystanie z mutexu ******************************
ptheread_mutex_t - typ mutexowy
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER - inicjowanie (mutex otwarty) (domyślna inicjalizacja)
pthread_mutex_lock(pthread_mutex* m) - zamknięcie mutexu
pthread_mutex_unlock(pthread_mutex* m) - otwarcie mutexu
uwaga:
- operacja pthread_mutex_lock blokuje wątek gdy mutex jest zamkniety
- operacja pthread_mutex_unlock jest niezdefiniowana gdy mutex jest otwarty
**************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
int x;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#define iter 10
void* p (void* l) { // funkcja watku (watek)
int i;
for (i=0;i<iter;i++) {
pthread_mutex_lock(&mutex);
x=i;
pthread_mutex_unlock(&mutex);
}
return 0;
}
void* q (void* l) { // funkcja watku (watek)
int i;
for (i=0;i<iter;i++) {
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
}
return 0;
}
int main () {
pthread_t w1,w2;
pthread_create(&w1, 0, p,0); // tworzy nowy watek
pthread_create(&w2, 0, q,0); // tworzy nowy watek
pthread_join(w1,0); // czeka na zakonczenie watku 1
pthread_join(w2,0);
return 0;
}
LyoqKioqKioqKioqKiogIGtvcnp5c3RhbmllIHogc2VtYWZvcsOzdyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpkZWtsYXJhY2plIHcgcGxpa3Ugc2VtYXBob3JlLmgKCgpzZW1fdCAJCS0gdHlwIHNlbWFmb3Jvd3kKc2VtX2luaXQoc2VtX3QqIHMsMCx3YXJ0b8WbxIdfc2VtYWZvcmEpIC0gaW5pY2pvd2FuaWUgd2FydG/Fm2NpxIUgcG9jesSFdGtvd8SFIHNlbWFmb3JhCnNlbV9wb3N0KHNlbV90KiBzKSAJLSBvcGVyYWNqYSBzaWduYWwKc2VtX3dhaXQoc2VtX3QqIHMpCS0gb3BlcmFjamEgd2FpdAoKCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKiAga29yenlzdGFuaWUgeiBtdXRleHUgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCnB0aGVyZWFkX211dGV4X3QgCQktIHR5cCBtdXRleG93eQoKcHRocmVhZF9tdXRleF90IG11dGV4PVBUSFJFQURfTVVURVhfSU5JVElBTElaRVIgLSBpbmljam93YW5pZSAobXV0ZXggb3R3YXJ0eSkgKGRvbXnFm2xuYSBpbmljamFsaXphY2phKQpwdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleCogbSkgCS0gemFta25pxJljaWUgbXV0ZXh1CnB0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXgqIG0pIAktIG90d2FyY2llIG11dGV4dQoKdXdhZ2E6IAotIG9wZXJhY2phIHB0aHJlYWRfbXV0ZXhfbG9jayBibG9rdWplIHfEhXRlayBnZHkgbXV0ZXggamVzdCB6YW1rbmlldHkKLSBvcGVyYWNqYSBwdGhyZWFkX211dGV4X3VubG9jayBqZXN0IG5pZXpkZWZpbmlvd2FuYSBnZHkgbXV0ZXggamVzdCBvdHdhcnR5CgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CgppbnQgeDsKcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKI2RlZmluZSBpdGVyIDEwCgp2b2lkKiBwICh2b2lkKiBsKSB7IC8vIGZ1bmtjamEgd2F0a3UgKHdhdGVrKQogICAgICBpbnQgaTsKCiAgICAgIGZvciAoaT0wO2k8aXRlcjtpKyspIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgICAgeD1pOwogcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgICAgfQoKICAgICAgCgpyZXR1cm4gMDsgICAgIAp9CgoKdm9pZCogcSAodm9pZCogbCkgeyAvLyBmdW5rY2phIHdhdGt1ICh3YXRlaykKICAgICAKICAgICAgaW50IGk7CgogICAgICBmb3IgKGk9MDtpPGl0ZXI7aSsrKSB7CiAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwoKICAgICAgcHJpbnRmKCJ4PSVkXG4iLHgpOwogICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICB9CgoKcmV0dXJuIDA7ICAgICAKfQoKCgppbnQgbWFpbiAoKSB7CglwdGhyZWFkX3QgdzEsdzI7CgkKCQkKICBwdGhyZWFkX2NyZWF0ZSgmdzEsIDAsIHAsMCk7IC8vIHR3b3J6eSBub3d5IHdhdGVrIAkJCiAgcHRocmVhZF9jcmVhdGUoJncyLCAwLCBxLDApOyAvLyB0d29yenkgbm93eSB3YXRlayAJCQkJCgkKCgoKCgoKCgogIHB0aHJlYWRfam9pbih3MSwwKTsgCS8vIGN6ZWthIG5hIHpha29uY3plbmllIHdhdGt1IDEKICBwdGhyZWFkX2pvaW4odzIsMCk7ICAgICAKICAKCiAgCiAgCnJldHVybiAwOwp9Cg==