【发布时间】:2016-03-07 18:22:27
【问题描述】:
我应该有两个线程来搜索数组中的最小元素:第一个线程搜索前半部分,第二个线程搜索另一半。但是,当我运行我的代码时,它似乎随机选择了一个线程。我不确定我做错了什么,但这可能与“中间”部分有关。我尝试将一个数组分成两部分,找到中点,然后从那里写入条件,但我可能在某个地方出错了。我也尝试将 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);
}
【问题讨论】:
-
为什么不通过 pthread_create 将低和高作为线程参数传递?您的代码有两个线程在数组上运行。此外,两个线程都将它们的结果保存到同一个全局,这可能不是您想要的。
-
我不明白这段代码如何实现问题中的要求?只能创建一个额外的线程 + 很多其他问题:(
-
OpenMP 比它简单 10 倍,并且受到 GCC 的支持,那么为什么要低级使用 pthread?
-
你给
pthread_create打了多少次电话?你应该创建多少个线程? -
“我以一种对我有意义的方式编辑了代码” 创建 20 个线程对你有意义吗?编辑只是产生了原始问题中没有的新问题。
标签: c arrays multithreading