Loading [MathJax]/extensions/tex2jax.js
Ask Your Question
1

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

asked Mar 6 '15

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;
}
add a comment

1 Answer

Sort by » oldest newest most voted
1

answered Mar 6 '15

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.

link
add a comment

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: Mar 6 '15

Seen: 321 times

Last updated: Mar 06 '15