用十个线程计算1+2+3+…..100,000,并输出正确结果。sem_init sem_destroy sem_post sem_wait
时间: 2024-05-04 14:16:07 浏览: 81
好的,我了解你的要求,并保证不透露给任何人。下面是用十个线程计算 1 2 3 …..100,000 并输出正确结果的代码,使用了信号量实现线程同步。
```c
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define NUM_THREADS 10
#define N 100000
int sum = 0;
sem_t sem;
void *calc_sum(void *thread_id) {
int id = *(int *)thread_id;
int start = id * (N/NUM_THREADS) + 1;
int end = start + (N/NUM_THREADS) - 1;
int local_sum = 0;
for (int i = start; i <= end; i++) {
local_sum += i;
}
sem_wait(&sem);
sum += local_sum;
sem_post(&sem);
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
sem_init(&sem, 0, 1);
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
int rc = pthread_create(&threads[i], NULL, calc_sum, (void *)&thread_ids[i]);
if (rc) {
printf("Failed to create thread %d\n", i);
exit(-1);
}
}
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&sem);
printf("The sum of 1 to %d is %d\n", N, sum);
return 0;
}
```
在 main 函数中,我们初始化了一个大小为 1 的信号量 sem,并把其初值设为 1。然后我们创建了 10 个线程,每个线程都执行 calc_sum 函数,计算从 start 到 end 的累加和,计算完毕后使用信号量控制 sum 的更新。
在 calc_sum 函数中,我们先确定了当前线程需要计算的范围 start 和 end,然后使用 local_sum 变量计算当前线程负责的部分的累加和。累加完成后,我们使用 sem_wait 函数获取 sem 的值,这个操作会阻塞当前线程,直到信号量的值大于 0,也就是其他线程都完成了对 sum 的更新,于是当前线程就可以安全地更新 sum 的值,并使用 sem_post 函数释放 sem,以通知其他线程可以访问 sum。
最后,在 main 函数中我们使用 pthread_join 等待所有线程都执行完毕,然后释放信号量 sem 并输出计算结果 sum。
阅读全文