简体   繁体   English

C线程并行编程

[英]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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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