#include "pthread.h" #include "stdio.h" #define NUM 10000000 long count=0; void *routine(void *arg) { for(int i=0;i<NUM;i++) count++; return 0; } void main(){ pthread_t threads[2]; pthread_create(&threads[0],NULL,routine,0); pthread_create(&threads[1],NULL,routine,0); pthread_join(threads[0],NULL); pthread_join(threads[1],NULL); printf("%ld\n",count); } 该程序运行后打印的数字与2*NUM相比,理论上可能会出现哪些情况(大于,等于,小于)?为什么?使用信号量修改此程序,杜绝可能的并发错误。
时间: 2023-06-26 12:07:09 浏览: 110
pthread_
该程序运行后打印的数字可能小于2*NUM。这是因为两个线程同时对count变量进行修改时,可能会出现竞争条件,导致其中一个线程的修改被覆盖或丢失。
使用信号量可以避免这种并发错误。可以定义一个信号量来保证只有一个线程可以访问count变量。具体实现如下:
```c++
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
#define NUM 10000000
long count = 0;
sem_t sem;
void *routine(void *arg) {
for (int i = 0; i < NUM; i++) {
sem_wait(&sem); // 等待信号量
count++;
sem_post(&sem); // 发送信号量
}
return 0;
}
int main() {
pthread_t threads[2];
sem_init(&sem, 0, 1); // 初始化信号量,初值为1
pthread_create(&threads[0], NULL, routine, 0);
pthread_create(&threads[1], NULL, routine, 0);
pthread_join(threads[0], NULL);
pthread_join(threads[1], NULL);
printf("%ld\n", count);
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在每个线程对count变量进行修改之前,都需要先等待信号量sem,保证只有一个线程可以访问count变量。修改完成后再发送信号量,让另一个线程可以继续访问。这样可以避免并发错误,保证count的值正确。
阅读全文