pthread_mutex_t внутри структуры и блокировка структуры при доступе - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть глобальный указатель структуры, который я сделал malloc (массив из 10 структур), и я отправил по одному экземпляру этой структуры в каждый поток, и прежде чем передать этот экземпляр структуры в качестве аргумента pthread_create (), я обновляю структурузначение члена.Внутри каждого потока я буду блокировать и распечатывать значение элемента.

Я создал другой поток, в котором я передаю весь экземпляр структуры, я блокирую каждый экземпляр структуры и печатаю его, но каждый раз, когда он печатает 0Можете ли вы предложить, какие изменения я должен сделать.

Я не хочу использовать какие-либо условия потока, так как я сплю в каждом потоке для переключения потока.

#include<stdio.h> 
#include<string.h> 
#include<pthread.h> 
#include<stdlib.h> 
#include<unistd.h> 

struct lock_check{
    int value;
    pthread_mutex_t lock; 
}; 
struct lock_check *check;

void* trythis(void *arg) 
{
    struct lock_check *thread = (struct lock_check *)arg;
    while(1){
        pthread_mutex_lock(&thread->lock); 
        printf("Inside Thread with value:%d\n", thread->value); 
        pthread_mutex_unlock(&thread->lock); 
        sleep(1);
    }
    return NULL; 
}

void* printthis(void *arg) 
{
    printf("Entering printthis thread\n");
    struct lock_check *print_thread = (struct lock_check *)arg;
    for(int i = 0; i < 10; i++){
        pthread_mutex_lock(&print_thread[i].lock); 
        printf("Printing value :%d\n", print_thread[i].value); 
        pthread_mutex_unlock(&print_thread[i].lock); 
    }
    return NULL; 
}
int main(void) 
{ 
    int i = 0; 
    int error; 
    check = malloc(sizeof(struct lock_check) * 10);
    pthread_t tid[10];
    pthread_t tid_read;

    for (int i = 0; i < 10; i++) {
        check[i].value = i;
        error = pthread_create(&(tid[i]), NULL, &trythis, &check[i]); 
        if (error != 0) 
            printf("\nThread can't be created :[%s]", strerror(error)); 
    }
    sleep(5);
    printf("creating printthis thread\n");
    error = pthread_create(&tid_read, NULL, &printthis, &check);
    for (int i = 0; i < 10; i++) {
        pthread_join(tid[i], NULL); 
    }
    pthread_join(tid_read, NULL); 
    return 0; 
} 

1 Ответ

0 голосов
/ 19 сентября 2019
error = pthread_create(&tid_read, NULL, &printthis, &check);

pthread_create ожидает void *, но вы передаете struct lock_check ** с неопределенным поведением.

Измените его на.

error = pthread_create(&tid_read, NULL, &printthis, check);
...