C 第二个pthread不会进入第二个循环
我的线程有问题。我试图在二维数组中找到主对角线的最大元素。第一个pthread将完成它的工作并找到max元素。但是,当第二和第三等阵型入党时,他们将不会进入第二阵型。我的函数如下所示:C 第二个pthread不会进入第二个循环,c,pthreads,max,C,Pthreads,Max,我的线程有问题。我试图在二维数组中找到主对角线的最大元素。第一个pthread将完成它的工作并找到max元素。但是,当第二和第三等阵型入党时,他们将不会进入第二阵型。我的函数如下所示: void* findMax() { //int t = 1; //*arr.times = 0; for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) { for (*arr.countJ = 0
void* findMax() {
//int t = 1;
//*arr.times = 0;
for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) {
for (*arr.countJ = 0; *arr.countJ < *arr.l; (*arr.countJ)++) {
printf("%d ", arr.a[*arr.countI][*arr.countJ]);
if (*arr.l - *arr.countJ == 1)
printf("\n");
}
}
*arr.countI = 0;
*arr.countJ = 0;
while (*arr.countI != *arr.l) {
while (*arr.countJ != *arr.l) {
if (*arr.countI == *arr.countJ) {
if (abs(arr.a[*arr.countI][*arr.countJ]) > *arr.max)
*arr.max = abs(arr.a[*arr.countI][*arr.countJ]);
}
++(*arr.countJ);
}
++(*arr.countI);
/*if (++(*arr.times) == 1) {
*arr.times = 0;
break;
}*/
}
printf("max = %d\n", *arr.max);
}
void *findMax(void *arg)
{
assert(arg == 0);
for (int i = 0; i < *arr.l; i++) {
for (int j = 0; j < *arr.l; j++) {
printf("%d ", arr.a[i][j]);
}
printf("\n");
}
int max = abs(arr.a[0][0]);
for (int i = 1; i < *arr.l; i++)
{
int absval = abs(arr.a[i][i]);
if (absval > max)
max = absval;
}
if (pthread_mutex_lock(arr.mtx) == 0)
{
*arr.max = max;
pthread_mutex_unlock(arr.mtx);
}
printf("max = %d\n", *arr.max);
return 0;
}
最大值等于4,这当然不对
arr是一个结构全局,拥有我所需要的一切;arr.a是数组
在过去的几天里,我把它弄得一团糟,但是运气不好…正如前面的评论中所指出的,您没有互斥性,因此您的线程都在忙于操作全局数组的元素,而不考虑其他线程在做什么 所有这些参考资料都很难看。互斥性在哪里确保没有线程在修改arr内部的任何内容,而另一个线程也在修改它?您有*arr.countI=0;,例如,但没有明显的相互排斥。您有*arr.max=absarr.a[*arr.countI][*arr.countJ];没有相互排斥。您有+++*arr.countJ;没有相互排斥。没有一条线索知道发生了什么。也许你很幸运,*arr.countI==*arr.l,这样他们就不会进入循环。但是您没有并发控制,所以一切都是猜测
我认为您应该停止从全局数据中使用countI和countJ,并且在大多数情况下使用arr.max。这些应该被每个线程的局部变量inti替换;int j;int max;。如果你沿着主对角线向下扫描,你不需要嵌套的循环——你只需要沿着对角线向下走。对于一项非常简单的工作,您的代码非常复杂。您仍然需要一个互斥体来允许可靠地设置*arr.max。arr.a和*arr.l是“OK”,但为什么*arr.l是指针?因为你不会修改它们。你答应归还一个空白,什么也不归还。对编译器撒谎是个坏主意™. 如果线程将任何内容存储到全局结构arr中,则需要确保存在互斥。我假设您拥有或添加了一个成员mtx,它是指向pthread_mutex_t的指针,pthread_mutex_t是在调用线程函数之前初始化的。我还假设findMax函数是从pthread_create调用的,并作为函数指针传递给它 您可以使用更简单的代码来完成此任务,如下所示:
void* findMax() {
//int t = 1;
//*arr.times = 0;
for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) {
for (*arr.countJ = 0; *arr.countJ < *arr.l; (*arr.countJ)++) {
printf("%d ", arr.a[*arr.countI][*arr.countJ]);
if (*arr.l - *arr.countJ == 1)
printf("\n");
}
}
*arr.countI = 0;
*arr.countJ = 0;
while (*arr.countI != *arr.l) {
while (*arr.countJ != *arr.l) {
if (*arr.countI == *arr.countJ) {
if (abs(arr.a[*arr.countI][*arr.countJ]) > *arr.max)
*arr.max = abs(arr.a[*arr.countI][*arr.countJ]);
}
++(*arr.countJ);
}
++(*arr.countI);
/*if (++(*arr.times) == 1) {
*arr.times = 0;
break;
}*/
}
printf("max = %d\n", *arr.max);
}
void *findMax(void *arg)
{
assert(arg == 0);
for (int i = 0; i < *arr.l; i++) {
for (int j = 0; j < *arr.l; j++) {
printf("%d ", arr.a[i][j]);
}
printf("\n");
}
int max = abs(arr.a[0][0]);
for (int i = 1; i < *arr.l; i++)
{
int absval = abs(arr.a[i][i]);
if (absval > max)
max = absval;
}
if (pthread_mutex_lock(arr.mtx) == 0)
{
*arr.max = max;
pthread_mutex_unlock(arr.mtx);
}
printf("max = %d\n", *arr.max);
return 0;
}
警告:未编译的代码 所有这些参考资料都很难看。互斥性在哪里确保没有线程在修改arr内部的任何内容,而另一个线程也在修改它?您有*arr.countI=0;例如,但没有明显的相互排斥。您有*arr.max=absarr.a[*arr.countI][*arr.countJ];没有相互排斥。您有+++*arr.countJ;没有相互排斥。没有一条线索知道发生了什么。也许你很幸运,*arr.countI==*arr.l,这样他们就不会进入循环。但是您没有并发控制,所以一切都是猜测。我认为您应该停止使用全局数据中的countI和countJ,并且在大多数情况下使用arr.max。这些应该被每个线程的局部变量inti替换;int j;int max;。如果你沿着主对角线向下扫描,你不需要嵌套的循环——你只需要沿着对角线向下走。对于一项非常简单的工作,您的代码非常复杂。您仍然需要一个互斥体来允许可靠地设置*arr.max。arr.a和*arr.l“正常”为什么*arr.l是指针?因为你不会修改它们。你答应归还一个空白,什么也不归还。对编译器撒谎是个坏主意。如果pthread_create调用此函数,则它缺少输入参数。thread函数被传递一个void*参数,它可能会也可能不会真正使用它。