使用线程在数组中查找最大值?
Find max in array using threads?
你如何在 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()
returns 和 int
,所以你可以看到这会导致问题。
如果启用编译器警告,就可以防止这种事情发生,我有时会忘记一些 header,但我不会忘记太多,因为编译器会提醒我。
假设您使用 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
的用法,它防止两个线程同时访问值。以及如何不需要全局变量,此外它们在多线程时是一个非常糟糕的主意。
除了上述优化之外,创建 pthread 时应指定可连接的属性(以保证 pthread_join() 将阻塞,直到指定的线程完成)。您可以通过声明 pthread_attr_t 类型的 'attr' 来实现。
编码示例如下所示。
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_t tid;
pthread_create(&tid, &attr, function, args);
//....
pthread_attr_destroy(&attr);
pthread_join(&tid, (void **)status);
pthread_attr_destroy() 在 pthread_join() 之前调用,因为一旦使用适当的参数调用 pthread_create() 就不再需要 attr。
你如何在 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()
returns 和 int
,所以你可以看到这会导致问题。
如果启用编译器警告,就可以防止这种事情发生,我有时会忘记一些 header,但我不会忘记太多,因为编译器会提醒我。
假设您使用 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
的用法,它防止两个线程同时访问值。以及如何不需要全局变量,此外它们在多线程时是一个非常糟糕的主意。
除了上述优化之外,创建 pthread 时应指定可连接的属性(以保证 pthread_join() 将阻塞,直到指定的线程完成)。您可以通过声明 pthread_attr_t 类型的 'attr' 来实现。 编码示例如下所示。
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_t tid;
pthread_create(&tid, &attr, function, args);
//....
pthread_attr_destroy(&attr);
pthread_join(&tid, (void **)status);
pthread_attr_destroy() 在 pthread_join() 之前调用,因为一旦使用适当的参数调用 pthread_create() 就不再需要 attr。