2.Linux下用C语言编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1观察程序运行的结果,并对你看到的现象进行解释((2)实验过程描述(主要算法或者流程、数据结构说明)、主要源代码注解、运行界面、问题分析和总结)。
时间: 2024-02-01 20:15:08 浏览: 30
(1)问题分析
本题要求在 Linux 下用 C 语言编写一个控制台应用程序,在程序中有一个共享的整型变量 shared_var,初始值为 0。程序创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出 shared_var 的值。主线程在循环中不断地对 shared_var 进行加 1 操作,即每次循环 shared_var 被加 1;而新创建的线程则不断地对 shared_var 进行减 1 操作,即每次循环 shared_var 被减 1。我们需要观察程序运行的结果,并对所看到的现象进行解释。
(2)实验过程描述
在本题中,我们需要用到 pthread 库来实现多线程编程。首先需要在程序中包含 pthread.h 头文件。然后需要定义一个共享的整型变量 shared_var,并初始化为 0。接着,我们需要定义两个线程:主线程和子线程。主线程中的循环不断地对 shared_var 进行加 1 操作,而子线程中的循环不断地对 shared_var 进行减 1 操作。在每次循环结束后,主线程和子线程都会输出当前的 shared_var 的值。程序运行的结果如下:
```
$ gcc -o main main.c -lpthread
$ ./main
shared_var=0
shared_var=0
shared_var=1
shared_var=-1
shared_var=2
shared_var=-2
...
```
从运行结果可以看出,主线程和子线程的输出交错出现,说明两个线程并发执行了。同时,shared_var 的值在主线程中不断增加,在子线程中不断减少,说明两个线程都可以访问共享的变量 shared_var,并且对它进行修改。
(3)主要算法或者流程、数据结构说明
本题的主要算法是多线程编程。我们使用 pthread_create 函数创建一个新线程,使用 pthread_join 函数等待新线程执行结束。在主线程和子线程中,我们使用 while 循环不断地对 shared_var 进行操作,并输出 shared_var 的值。为了保证线程安全,我们需要使用互斥锁来保护共享的变量 shared_var。
(4)主要源代码注解
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int shared_var = 0; // 共享变量
pthread_mutex_t mutex; // 互斥锁
void *thread_func(void *arg) {
while (1) {
pthread_mutex_lock(&mutex); // 加锁
shared_var--; // 减 1
printf("shared_var=%d\n", shared_var);
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
int main(int argc, char *argv[]) {
pthread_t tid; // 线程 ID
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
printf("shared_var=%d\n", shared_var);
// 创建子线程
if (pthread_create(&tid, NULL, thread_func, NULL) != 0) {
printf("create thread error\n");
return -1;
}
while (1) {
pthread_mutex_lock(&mutex); // 加锁
shared_var++; // 加 1
printf("shared_var=%d\n", shared_var);
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_join(tid, NULL); // 等待子线程执行结束
return 0;
}
```
(5)运行界面
程序运行的界面如下:
```
$ gcc -o main main.c -lpthread
$ ./main
shared_var=0
shared_var=0
shared_var=1
shared_var=-1
shared_var=2
shared_var=-2
...
```
(6)问题分析和总结
本题要求我们实现多线程编程,并使用互斥锁保证线程安全。在多线程编程中,我们需要注意以下几点:
- 互斥锁的使用:在访问共享变量时,需要使用互斥锁来保护共享变量,以避免多个线程同时修改变量导致的问题。
- 线程的创建和销毁:需要使用 pthread_create 函数创建一个新线程,并使用 pthread_join 函数等待新线程执行结束。
- 线程的并发执行:多个线程可以并发执行,输出的结果可能会交错出现,需要注意输出的顺序。
在本题中,我们通过多线程编程实现了对共享变量的并发访问,同时使用互斥锁保证了线程安全。这对于实现高效的并发程序非常重要。
相关推荐
![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_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)
![](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)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)