Mutex (a další) jako lokální proměnné?
Napadlo mě zkusit si modifikovat úlohu z prvního cvika BI-OSY, kde se za pomocí dvou vláken inkrementuje counter, na verzi se všemi proměnnými na zásobníku. No a po prvotním otestování to vypadá funkčně. Takže otázka zní, lze to takhle obecně řešit?
Jde o to, že ty vlákna přistupují do paměti cizího zásobníku, což si nejsem jistej, že je tak úplně správně :-). Příkládám kód toho programu.
#include <stdio.h>
#include <pthread.h>
typedef struct {
pthread_mutex_t * mutex;
int * cnt, n;
} Args;
void * worker(Args * x) {
int i;
for (i = 0; i < x->n; i++) {
pthread_mutex_lock(x->mutex);
*x->cnt += 1;
pthread_mutex_unlock(x->mutex);
}
return NULL;
}
int main(void) {
pthread_t t1, t2;
pthread_attr_t attr;
pthread_mutex_t mutex;
int counter = 0;
Args args1, args2;
args1.cnt = args2.cnt = &counter;
args1.mutex = args2.mutex = &mutex;
args1.n = 1000000;
args2.n = 2000000;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_mutex_init(&mutex, NULL);
pthread_create(&t1, &attr, (void *(*)(void *))worker, &args1);
pthread_create(&t2, &attr, (void *(*)(void *))worker, &args2);
pthread_attr_destroy(&attr);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);
printf("result: %d\n", counter);
return 0;
}