gpt4 book ai didi

c - 使用线程在数组中查找最大值?

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

在 c 语言中,您如何使用二元归约和使用二元信号量实现的屏障来做到这一点?这是我到目前为止的代码。它没有障碍,我对如何制作障碍感到困惑。为此我需要互斥锁吗?

# include <stdio.h>
# include <pthread.h>
# define arrSize 10

struct StructMax
{
int iMax;
};

int arr[arrSize];

void *thread_search_max(void *);

int main()
{
pthread_t tid;
struct StructMax *st_main,*st_th;
int FinalMax;

st_main=(struct StructMax*)malloc(sizeof(struct StructMax));

int iCount;
for(iCount=0;iCount<arrSize;iCount++)
{
printf("Enter Value of arr[%d] :",iCount);
scanf("%d",&arr[iCount]);
}
pthread_create(&tid,NULL,thread_search_max,NULL);

st_main->iMax=arr[0];

for(iCount=1;iCount<arrSize/2;iCount++)
{
if(arr[iCount] > st_main->iMax)
{
st_main->iMax=arr[iCount];
}
}

pthread_join(tid,(void**)&st_th);

if(st_main->iMax >= st_th->iMax)
{
FinalMax=st_main->iMax;
}
else
{
FinalMax=st_th->iMax;
}


printf("Final Max : %d \n",FinalMax);
return 0;
}


void *thread_search_max(void *para)
{
struct StructMax *st;
st=(struct StructMax*)malloc(sizeof(struct StructMax));

int iCount;
st->iMax=arr[arrSize/2];


for(iCount=arrSize/2 + 1;iCount<arrSize;iCount++)
{
if(arr[iCount] > st->iMax)
{
st->iMax=arr[iCount];
}
}

pthread_exit((void*)st);
}

最佳答案

您没有包含 stdlib.h:这是主要问题,但您还应该考虑其他一些可以使您的代码健壮的小修复。

不包含 stdlib.h 的问题是编译器假设 malloc() 返回一个 int,所以你可以看到这会导致问题。

如果你启用编译器警告,你可以防止这种事情发生,我有时会忘记一些标题,但我不会忘记太多,因为编译器会提醒我。

假设您使用 gcc 然后

gcc -Wall -Werror -o output $sourceFiles -pthread

在这种情况下会阻止编译。

这是您程序的改进版本,包含 stdlib.h header

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define arrSize 10

struct StructMax
{
int iMax;
};

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *thread_search_max(void *);

int main()
{
pthread_t tid;
struct StructMax *st_main;
struct StructMax *st_th;
int FinalMax;
int arr[arrSize];

st_main = malloc(sizeof(struct StructMax));
if (st_main == NULL)
return -1;
int iCount;
for (iCount = 0 ; iCount < arrSize ; iCount++)
{
printf("Enter Value of arr[%d] :",iCount);
scanf("%d",&arr[iCount]);
}
pthread_create(&tid, NULL, thread_search_max, arr);

/* lock the mutex, in this secction we access 'arr' */
pthread_mutex_lock(&mutex);
st_main->iMax = arr[0];
pthread_mutex_unlock(&mutex);

for (iCount = 1 ; iCount < arrSize / 2 ; iCount++)
{
/* lock the mutex, in this secction we access 'arr' */
pthread_mutex_lock(&mutex);
if (arr[iCount] > st_main->iMax)
{
st_main->iMax = arr[iCount];
}
pthread_mutex_unlock(&mutex);
}
pthread_join(tid, (void **)&st_th);

if (st_main->iMax >= st_th->iMax)
{
FinalMax = st_main->iMax;
}
else
{
FinalMax = st_th->iMax;
}
printf("Final Max : %d \n", FinalMax);
free(st_th);
free(st_main);
return 0;
}

void *thread_search_max(void *para)
{
struct StructMax *st;
int iCount;
int *arr;

arr = para;
if (arr == NULL)
return NULL;
st = malloc(sizeof(struct StructMax));
if (st == NULL)
return NULL;
/* lock the mutex, in this secction we access 'arr' */
pthread_mutex_lock(&mutex);
st->iMax = arr[arrSize/2];
pthread_mutex_unlock(&mutex);
for (iCount = arrSize / 2 + 1 ; iCount < arrSize ; iCount++)
{
/* lock the mutex, in this secction we access 'arr' */
pthread_mutex_lock(&mutex);
if (arr[iCount] > st->iMax)
{
st->iMax = arr[iCount];
}
pthread_mutex_unlock(&mutex);
}
pthread_exit((void *)st);
}

查看mutex 的用法,它防止两个线程同时访问该值。以及如何不需要全局变量,此外在多线程时它们是一个非常糟糕的主意。

关于c - 使用线程在数组中查找最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586044/

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