У меня есть глобальный указатель структуры, который я сделал 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;
}