gpt4 book ai didi

在多线程编程中更改值

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:52 25 4
gpt4 key购买 nike

我有一个关于婚姻运营的项目。在这个程序中,一个名为 registrar 的线程使用了 marriage 函数。在这场婚姻行动中,我们有新娘和新郎。婚姻功能确实会一一减少新娘数和新郎数。但是当我想减少这些计数时我遇到了问题。

MAIN.c

#include<pthread.h>
#include<stdlib.h>
#include<stdio.h>
#include<semaphore.h>
#include "bride.h"
#include "groom.h"

pthread_t groomThread;
pthread_t brideThread;
sem_t registrarSemaphore;
pthread_mutex_t lock;

int *groomCount = 14;
int *brideCount = 20;
int *availableRegistrar;

void createBride(int *brideCount) {
pthread_create(&brideThread, NULL, &increaseBrideCount, (void *) brideCount);
}

void createGroom(int *groomCount) {
pthread_create(&groomThread, NULL, &increaseGroomCount, (void *) groomCount);
}

void deleteGroom(int *groomCount) {
pthread_create(&groomThread, NULL, &decreaseGroomCount, (void *) groomCount);
}

void deleteBride(int *brideCount) {
pthread_create(&brideThread, NULL, &decreaseBrideCount, (void *) brideCount);
}


void marriage() {
sem_init(&registrarSemaphore, 0, 2);

while (1) {
sem_getvalue(&registrarSemaphore, &availableRegistrar);

printf("\nAvailable Registrar Number = %d\n", availableRegistrar);

printf("bride %d\n", brideCount);
printf("groom %d\n", groomCount);

if (brideCount > 0 && groomCount > 0) {
sem_wait(&registrarSemaphore);
sem_getvalue(&registrarSemaphore, &availableRegistrar);
printf("Available Registrar %d \n", availableRegistrar);

printf("Marriage Bride %d and Groom %d \n", brideCount, groomCount);
pthread_mutex_lock(&lock);
deleteBride(brideCount);
pthread_mutex_unlock(&lock);
//pthread_join(brideThread, &brideCount);
pthread_mutex_lock(&lock);
deleteGroom(groomCount);
pthread_mutex_unlock(&lock);
//pthread_join(groomThread, &groomCount);
printf("Exiting critical region...\n\n");
/* END CRITICAL REGION */
sem_post(&registrarSemaphore);
}


int random = rand() % 100;
if (random % 7 > 4) {
printf("Bride Created\n");
pthread_mutex_lock(&lock);
createBride(brideCount);
//pthread_join(brideThread, &brideCount);
pthread_mutex_unlock(&lock);

}

if (random % 7 < 2) {
printf("Groom Created\n");
pthread_mutex_lock(&lock);
createGroom(groomCount);
//pthread_join(groomThread, &groomCount);
pthread_mutex_unlock(&lock);
}

pthread_join(brideThread, &brideCount);
pthread_join(groomThread, &groomCount);

for (int i = 0; i < 100000000; i++);
printf("------------------------------");
}
}

int main(void) {
marriage();
}

在pthread_create 部分,如您所见,有一些函数。它在 .h 部分定义。例如在 bride.h 中,有 2 个关于 bride 的函数。

BRIDE.H

#ifndef BRIDE_H
#define BRIDE_H

void* increaseBrideCount(void * bride);
void* decreaseBrideCount(void * bride);

#endif

BRIDE.C

#include <pthread.h>
#include "bride.h"


void* increaseBrideCount(void *bride){
int brideCount = (int)bride;
brideCount++;
pthread_exit(brideCount);
}

void* decreaseBrideCount(void* bride){
int brideCount = (int)bride;
brideCount--;
pthread_exit(brideCount);
}

在创建新新娘时,我无法将新娘的新值发送给函数。例如:

起初我有 20 个新娘和 14 个新郎。我有 2 个可用的注册商

Marraige 确实如此。

新娘数 = 19,新郎数 = 13

然后,我要创造新的新娘。

它计数为 = 1 :( 我试图再次使其达到 20。

如果你能帮上忙,我会很高兴。谢谢

最佳答案

信号量用于确保一次只有一个线程可能会做出特定更改。在这种情况下要更改的是新娘和新郎的数量,因此您需要使用信号量“保护”它们。您甚至似乎为此目的创建了信号量(brideSemaphoregroomSemaphore);你只需要使用它们。

顺便说一句:如果你只在一个线程中使用信号量,你就是在浪费时间(就像你的 registrarSemaphore 一样)在 marriage() )。它要么也需要在其他地方使用,要么根本不用。

关于在多线程编程中更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40890842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com