Как бы вы это сделали в c с двоичным сокращением и барьером, реализованным с использованием двоичных семафоров? Это код, который у меня есть до сих пор. У него нет барьера, и я смущен тем, как его создать. Мне нужны блокировки для мьютексов?Найти max в массиве с помощью потоков?
# 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);
}
[Не бросайте возвращаемое значение 'malloc()' in C] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). Напишите свои распределения как: 'st_main = malloc (sizeof * st_main);'. Гораздо короче, бессмысленными бросками и немного более безопасными. – unwind
Как и все остальные, вы бросаете 'malloc()', [который не нужен] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc), но игнорируйте его возвращаемое значение, что является плохой практикой. Кроме того, используйте мьютекс и не используйте глобальную переменную, передайте массив функции потока через последний аргумент в 'pthread_create'. И помните, что каждый 'malloc()' должен быть сопоставлен 'free()' где-то. –
Семафор? Барьеры? Я бы избегал их поисков максимума в массиве, они бы повредили производительность, чтобы вернуть вас к прямому параллельному исполнению. Если вы делаете это для производительности, я бы подумал использовать _atomics_ (с очень тщательной реализацией) или даже (если ваша архитектура позволяет вам это _trick_) с помощью _volatile_. –