我需要使用多线程将大量数字相乘。要相乘的两个数字最多可以有10000个数字。我已经使用一个线程编写了乘法代码。但是当我将多个线程分配给不同的数字时,我不确定如何相乘。例如,如果两个数字是:254678和378929并且有3个线程,我将两个数字分别分配给一个线程(2,5-Thread 1),(4,6-> Thread 2),(7 ,8->线程3),并且每个数字都应乘以第二个数字的数字-> 378929。当线程将并行运行时,当多个线程同时更新变量时,我不知道如何管理进位变量。输入:数组包含两个数字索引:i1包含第一个数字的最后一位索引:i2包含第二个数字的最后一位enter code herefor (int i=i1-1; i>=1; i--){ int carry = 0; int n1 = input[i]; t2 = 0; for(int j=i2-1; j>i1-1; j--){ int n2 = input[j]; int sum = n1*n2 + output[t1+t2] + carry; carry = sum/10; output[t1+t2] = sum % 10; t2++; } if(carry > 0) output[t1 + t2] += carry; t1++;}int main() { pthread_t threads[MAX_THREAD]; for (int i = 0; i < MAX_THREAD; i++) pthread_create(&threads[i], NULL, &multiply, (void*)NULL); for (int i = 0; i < MAX_THREAD; i++) pthread_join(threads[i], NULL);} 最佳答案 当线程将并行运行时,当多个线程同时更新变量时,我不知道如何管理进位变量。不允许多个线程同时更新任何内容。具体来说(假设每个数字都是“ base 1 my_accumulator = table_of_per_thread_accumulators[thread_number];for (int src1_digit_number = startDigit; src1_digit_number >= 0; src1_digit_number -= NUM_THREADS ) { for (int src2_digit_number = src2_digits-1; src2_digit_number >= 0; src2_digit_number-- ) { int dest_digit_number = src1_digit_number + src2_digit_number; uint32_t n1 = input1[src1_digit_number]; uint32_t n2 = input2[src2_digit_number]; uint64_t r = (uint64_t)n1 * n2; while(r != 0) { uint64_t temp = my_accumulator[dest_digit_number] + (r & 0xFFFFFFFFUL); my_accumulator[dest_digit_number++] = temp; temp >>= 32; r = (r >> 32) + temp; } }}然后,当所有线程结束时(在某些“ pthread_join()”调用之后?),您需要将每个线程单独的my_accumulator中的数字相加,以获得实际结果。注1:从理论上讲,您可以执行一些“累加器的二进制合并”,以使奇数线程等待下一个较低编号的线程完成,并将该线程的累加器添加到自己的累加器中。然后,满足“ my_thread_number % 4 == 3”的线程等待编号为“ my_thread_number-2”的线程完成,并将其累加器添加到自己的累加器中;然后...这很可能太复杂和混乱了。注2:替代方法(如果使用由多个线程修改的单个output[])是具有互斥量以确保只有一个线程可以同时修改output[](或多个互斥体以确保只有一个线程可以修改一次output[]);这会严重破坏性能,以至于使用单个线程会更快。注意3:另一种选择是使用原子方式,或使用内联汇编(例如“ lock add [output+rdi],eax;”),这样就不需要互斥体。这仍然非常糟糕,因为CPU会争夺同一高速缓存行的独占访问权(并且由于CPU花费大量时间试图获得对高速缓存行的独占访问权,会破坏性能)。关于c - 使用多线程将大数相乘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58443315/
10-15 10:55