2. Linux下用C语言编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1观察程序运行的结果,并对你看到的现象进行解释。
时间: 2024-02-28 21:55:19 浏览: 21
好的,这是一个非常典型的线程同步问题。在这个程序中,我们有两个线程同时访问同一个共享变量shared_var,因此需要使用线程同步来确保线程安全。以下是程序的代码实现:
```c
#include <stdio.h>
#include <pthread.h>
int shared_var = 0;
void *thread_func(void *arg) {
while (1) {
printf("Thread: shared_var=%d\n", shared_var);
shared_var--;
}
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
while (1) {
printf("Main: shared_var=%d\n", shared_var);
shared_var++;
}
return 0;
}
```
在这个程序中,我们使用了pthread库来创建一个新线程。新线程的入口函数是thread_func,它不断地减少shared_var的值,并输出shared_var的值。主线程也不断地增加shared_var的值,并输出shared_var的值。由于两个线程都在不断地访问shared_var,因此需要使用线程同步来确保线程安全。
对于线程同步,我们可以使用互斥锁mutex。在主线程和新线程中,我们都需要先锁住mutex,然后再访问shared_var,最后再解锁mutex。这样可以确保同一时间只有一个线程在访问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);
}
}
int main() {
pthread_t tid;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid, NULL, thread_func, NULL);
while (1) {
pthread_mutex_lock(&mutex);
printf("Main: shared_var=%d\n", shared_var);
shared_var++;
pthread_mutex_unlock(&mutex);
}
return 0;
}
```
现在,我们可以编译并运行这个程序。运行程序后,我们会看到主线程和新线程交替输出shared_var的值。由于主线程不断地增加shared_var的值,而新线程不断地减少shared_var的值,因此shared_var的值会在主线程和新线程之间不断地变化。
需要注意的是,由于两个线程都是无限循环的,因此这个程序不会自动停止。如果需要停止程序,可以在命令行中按下Ctrl+C。