2.Linux下用C语言编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1观察程序运行的结果,并对你看到的现象进行解释。
时间: 2024-02-28 16:52:23 浏览: 24
这是一个经典的线程同步问题,因为主线程和新线程同时访问和修改共享变量shared_var,所以需要使用同步机制来保证线程安全。可以使用互斥锁来实现线程同步,保证同一时间只有一个线程能够访问和修改共享变量。
以下是示例代码:
```c
#include <stdio.h>
#include <pthread.h>
int shared_var = 0;
pthread_mutex_t mutex;
void *thread_func(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
printf("Thread: shared_var = %d\n", shared_var);
shared_var--;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t tid;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid, NULL, thread_func, NULL);
while (1) {
pthread_mutex_lock(&mutex);
shared_var++;
printf("Main thread: shared_var = %d\n", shared_var);
pthread_mutex_unlock(&mutex);
}
pthread_join(tid, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在主线程中,我们不断地对shared_var进行加1操作,并在控制台输出变量的值。在新线程中,我们不断地对shared_var进行减1操作,并在控制台输出变量的值。由于使用了互斥锁,可以确保同一时间只有一个线程能够访问和修改共享变量。运行程序后,可以看到变量的值不断地在主线程和新线程中进行增减操作,但是由于同步机制的作用,变量的值不会出现意外的错误。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)