如何在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);
}
答案 0 :(得分:1)
您没有包含stdlib.h
:这是主要问题,但您还应该考虑一些其他可以使代码健壮的小修补程序。
不包含stdlib.h
的问题是编译器假定malloc()
返回int
,因此您可以看到这会导致问题。
如果你启用编译器警告,你可以防止这种事情,我有时会忘记一些标题,但是我不会太过分,因为编译器会提醒我。
假设您使用gcc
gcc -Wall -Werror -o output $sourceFiles -pthread
在这种情况下,会阻止编译。
这是您的程序的改进版本,其中包含stdlib.h
标头
#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
的用法,它可以防止两个线程同时访问该值。以及如何不需要全局变量,除了在多线程时它们是一个非常糟糕的主意。
答案 1 :(得分:0)
添加到上面的优化中,应该使用指定可连接的attrributes创建pthread(以保证pthread_join()将阻止直到指定的线程完成)。你可以通过声明一个&#39; attr&#39;类型为pthread_attr_t。 编码的示例如下所示。
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_join()之前调用pthread_attr_destroy(),因为一旦使用适当的参数调用pthread_create(),就不再需要attr。