Я изучаю системное программирование в Linux, поэтому я просто попытался написать очень распространенную программу, которая является производителем и потребителем.Я использовал механизм семафоров для реализации своего кода.К сожалению, я получил ошибку сегментации , которую я действительно не мог найти, где я был не прав.Я надеюсь, что кто-то может помочь мне, спасибо.
Код следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem_consumer;
sem_t sem_producer;
typedef struct node
{
int data;
struct node *next;
} Node;
Node * head = NULL;
void * producer(void *arg)
{
while (1)
{
sem_wait(&sem_producer);
Node *ptr = (Node *)malloc(sizeof(Node));
ptr->data = rand() % 1000;
printf("++++++ producer: %lu, %d\n", pthread_self(), ptr->data);
ptr->next = head;
head = ptr;
sem_post(&sem_consumer);
}
return NULL;
}
void * consumer(void * arg)
{
while (1)
{
sem_wait(&sem_consumer);
Node *pdel = head;
head = head -> next;
printf("------ consumer: %lu, %d\n", pthread_self(), pdel->data);
free(pdel);
sem_post(&sem_producer);
}
return NULL;
}
int main(int argc, char *argv[])
{
sem_init(&sem_consumer, 0, 0);
sem_init(&sem_producer, 0, 3);
pthread_t pthid[2];
pthread_create(&pthid[0], NULL, producer, NULL);
pthread_create(&pthid[1], NULL, consumer, NULL);
for (int i = 0; i < 2; i++)
{
pthread_join(pthid[i], NULL);
}
sem_destroy(&sem_consumer);
sem_destroy(&sem_producer);
return 0;
}