Ask Your Question
1

Mutex (a další) jako lokální proměnné?

asked 2015-03-06 14:02:21 +0100

Greg gravatar image

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;
}
edit retag flag offensive close delete

1 Answer

Sort by » oldest newest most voted
1

answered 2015-03-06 14:24:00 +0100

Josef Kokeš gravatar image

Lze, pokud zajistíte, že funkce, která "vlastní" ten zásobník, skončí až po skončení všech vláken.

edit flag offensive delete publish link more

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2015-03-06 14:02:21 +0100

Seen: 321 times

Last updated: Mar 06 '15