简体   繁体   中英

C thread parallel programming

I tried to make a parallel program that generates a random number with one thread and the other thread writes it.

Am I doing something wrong that messes with the performance/optimization? I ask it because it was very easy to write this program so I'm a little concerned that I am doing something wrong.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#include "produceConsume.h"
#define NUM_THREAD 1

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int queue[1];
int queueCounter = 0;

void *producer(void *args)
{
    while (1)
    {
        pthread_mutex_lock(&lock);
        int n = rand() % 100;
        queue[queueCounter] = n;
        queueCounter++;
        pthread_cond_wait(&cond, &lock);
        pthread_mutex_unlock(&lock);
    }
}

void *consumer(void *args)
{
    while (1)
    {
        pthread_mutex_lock(&lock);
        printf("%d\n", queue[queueCounter - 1]);
        queueCounter--;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&lock);
        sleep(1);
    }
}

int main()
{
    system("clear");
    srand(time(NULL));
    pthread_t th[NUM_THREAD], th2[NUM_THREAD];

    for (int i = 0; i < NUM_THREAD; i++)
    {
        pthread_create(&th[i], NULL, &producer, NULL);
        pthread_create(&th2[i], NULL, &consumer, NULL);
    }

    for (int i = 0; i < NUM_THREAD; i++)
    {
        pthread_join(th[i], NULL);
        pthread_join(th2[i], NULL);
    }
}

You don't need an array if you are going to use only one thread, in any case, you create two threads but only one is joined (leaking memory), instead:

pthread_t th1[NUM_THREAD]; // or simply pthread_t th1;
pthread_t th2[NUM_THREAD]; // or simply pthread_t th2;

for (int i = 0; i < NUM_THREAD; i++)
{
    pthread_create(&th1[i], NULL, &producer, NULL);
    pthread_create(&th2[i], NULL, &consumer, NULL);
}

for (int i = 0; i < NUM_THREAD; i++)
{
    pthread_join(th1[i], NULL);
    pthread_join(th2[i], NULL);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM