gpt4 book ai didi

c - C中的多线程搜索

转载 作者:行者123 更新时间:2023-11-30 18:37:48 25 4
gpt4 key购买 nike

我应该有两个线程来搜索数组中的最小元素:第一个线程搜索前半部分,第二个线程搜索另一半。然而,当我运行我的代码时,它似乎随机选择一个线程。我不确定我做错了什么,但这可能与“中间”部分有关。我尝试将一个数组分成两部分,找到中点,然后从那里编写条件,但我可能在某个地方出错了。我还尝试将 array[i] 放入条件中,但在这种情况下只有 thread2 执行。

编辑:我真的在这里尽力了,但我没有取得任何进展。我以一种对我来说有意义的方式编辑了代码,我可能输入了“min”错误,但现在它甚至不执行它只是给了我一个错误,即使它编译得很好。我只是一个初学者,虽然我确实理解你们所谈论的一切,但我很难实现这些想法,所以真的,任何解决这个问题的帮助都是值得赞赏的!

EDIT2:好吧,前面的代码根本没有任何意义,我很抱歉,但我在编写它时已经筋疲力尽了。不管怎样,我想出了其他一些部分有效的东西!我将数组分成两半,但是使用指针时只能访问第一个元素。但是如果整个数组都被访问的话它会起作用吗?如果是的话我该如何解决这个问题?

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

#define size 20

void *smallest(void *arg);
pthread_t th, th2;
int array[size], i, min;

int main(int argc, char *argv[]) {

srand ( time(NULL) );
for(i = 0; i < size; i++)
{
array[i] = (rand() % 100)+1;
printf("%d ", array[i]);
}

int *array1 = malloc(10 * sizeof(int));
int *array2 = malloc(10 * sizeof(int));
memcpy(array1, array, 10 * sizeof(int));
memcpy(array2, array + 10, 10 * sizeof(int));

printf("\nFirst half gives %d \n", *array1);
printf("Second half gives %d \n", *array2);


pthread_create(&th, NULL, smallest, (void*) array1);
pthread_create(&th2, NULL, smallest, (void*) array2);

pthread_join(th, NULL);
pthread_join(th2, NULL);

//printf("\nFirst half gives %d\n", array1);
//printf("Second half gives %d\n", array2);


if (*array1 < *array2) {
printf("\nThread1 finds the number\n");
printf("The smallest element is %i\n", *array1);
}
else {
printf("\nThread2 finds the number\n");
printf("The smallest element is %i\n", *array2);
}

return 0;
}

void *smallest(void* arg){

int *array = (int*)arg;

min = array[0];
for (i = 0; i < size; i++) {
if (array[i] < min) {
min = array[i];
}
}
pthread_exit(NULL);
}

最佳答案

您设置的代码永远不会运行多个线程。请注意,如果运行 if 语句的第一个分支,则会触发一个线程来搜索一半数组,等待它完成,然后继续前进,如果执行 else 分支,则在后半部分中会发生相同的情况数组。从根本上讲,您可能需要重新考虑您的策略,让代码始终启动两个线程,并仅在两个线程开始运行后才加入每个线程。

您的 if 语句中的条件似乎也是错误的。您询问数组的中间元素是否大于其索引。我认为这不是您想要做的。

最后,每个线程中的代码始终查看整个数组,而不仅仅是其中的一半。我建议重写线程例程,使其参数代表要取最小值的范围的开始和结束索引。然后,您将更新 main 中的代码,以便在关闭线程时指定要搜索的范围。

我会构建这样的东西:

  1. 启动一个线程来查找数组前半部分的最小值。
  2. 启动一个线程来查找数组后半部分的最小值。
  3. 加入两个线程。
  4. 使用每个线程的结果来找到最小值。

最后一点,由于您将有两个不同的线程同时运行,因此您需要注意数据争用,因为两个线程都尝试读取或写入最小值。考虑让每个线程使用其退出代码来指示最小值在哪里,然后在 main 中解析真正的最小值。这消除了竞争条件。或者,有一个全局最小值,但用互斥体保护它。

关于c - C中的多线程搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35851058/

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