2.Linux下用C语言编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1观察程序运行的结果,并对你看到的现象进行解释(实验过程描述(主要算法或者流程、数据结构说明)、主要源代码注解、运行界面、问题分析和总结)。
时间: 2024-02-13 15:01:38 浏览: 77
实验过程描述:
本实验中,我们需要在 Linux下用C语言编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。观察程序运行的结果,并对你看到的现象进行解释。
主要算法或者流程、数据结构说明:
本实验中,我们需要使用线程来实现并发执行。在 Linux下,线程的创建和管理可以使用 pthread 库来实现。我们需要使用 pthread_create() 函数来创建新线程,并使用 pthread_join() 函数来等待新线程的结束。
在本实验中,我们需要共享一个整型变量shared_var。为了防止多线程访问时发生竞争条件,我们需要使用互斥锁来保护共享变量。在 Linux下,互斥锁可以使用 pthread_mutex_t 类型来定义,并使用 pthread_mutex_init() 函数进行初始化。在访问共享变量时,需要使用 pthread_mutex_lock() 函数进行加锁,使用 pthread_mutex_unlock() 函数进行解锁。
主要源代码注解:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int shared_var = 0; // 共享变量
pthread_mutex_t mutex; // 互斥锁
// 线程函数,不断进行 shared_var 减 1 操作
void *thread_func(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex); // 加锁
shared_var--;
printf("Thread: shared_var = %d\n", shared_var);
pthread_mutex_unlock(&mutex); // 解锁
}
}
int main()
{
pthread_t tid; // 存储新线程的 ID
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
// 创建新线程
if (pthread_create(&tid, NULL, thread_func, NULL) != 0) {
perror("pthread_create error");
exit(1);
}
// 主线程不断进行 shared_var 加 1 操作
while (1) {
pthread_mutex_lock(&mutex); // 加锁
shared_var++;
printf("Main: shared_var = %d\n", shared_var);
pthread_mutex_unlock(&mutex); // 解锁
}
// 等待新线程结束
if (pthread_join(tid, NULL) != 0) {
perror("pthread_join error");
exit(1);
}
pthread_mutex_destroy(&mutex); // 销毁互斥锁
return 0;
}
```
运行界面:
```
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
Main: shared_var = 1
Thread: shared_var = 0
```
问题分析和总结:
从运行结果可以看出,主线程不断进行 shared_var 加 1 操作,而新线程不断进行 shared_var 减 1 操作。由于共享变量没有进行同步操作,因此会发生竞争条件,导致 shared_var 的值不断地在 0 和 1 之间进行变化。
为了解决竞争条件的问题,我们使用了互斥锁来保护共享变量。在访问共享变量时,需要先使用 pthread_mutex_lock() 函数进行加锁,操作完成后再使用 pthread_mutex_unlock() 函数进行解锁。这样可以保证同一时刻只有一个线程能够访问共享变量,避免了竞争条件的问题。
总的来说,本实验通过使用线程和互斥锁的方式实现了对共享变量的并发访问。在实际的应用中,我们需要注意竞争条件的问题,并采取相应的同步措施来保护共享变量。
阅读全文