【发布时间】:2020-02-15 00:08:34
【问题描述】:
我需要使用多线程将大数相乘。要相乘的两个数字最多可以有 10000 位。我使用单线程编写了乘法代码。但是当我将多个线程分配给不同的数字时,我不确定如何相乘。
例如,如果这两个数字是:254678 和 378929,并且有 3 个线程,我将这两个数字中的每一个分配给一个线程(2,5-Thread 1),(4,6->Thread 2) ,(7,8-> Thread 3) 并且每个数字都应该乘以第二个数字的数字-> 378929。
当线程并行运行时,当多个线程同时更新变量时,我不知道如何管理进位变量。
输入:数组包含两个数字
index: i1 包含第一个数字的最后一位
index: i2 包含第二个数字的最后一位
enter code here
for (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);
}
【问题讨论】:
-
也许你用错了方法。为什么不让每个线程为您感兴趣的任何数字计算一整行乘法,并保留部分和。当所有线程都完成后,将所有部分和相加。
-
我确实想过这样做,但由于线程数可以是 100,输出数组大小可以是 10^8(10^4*10^4),所以二维数组大小将是 10 ^2 * 10^8=10^10.
-
不,如果你有 100 个线程,那么你只有 100 个累加器/部分和。
标签: c multithreading operating-system