本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下: 补全ThreadHandler1和ThreadHandler2函数中代码,使用信号量来同步这两个线程(两个线程相互交替执行),使其执行顺序为ThreadHandler1 > ThreadHandler2 > ThreadHandler1...; 信号量sem1被初始化为1,信号量sem2被初始化为0; 提示:参考相关知识中的信号量同步多线程内容;写个实验报告
时间: 2024-02-22 15:55:29 浏览: 268
使用信号量实现线程同步
4星 · 用户满意度95%
以下是针对本关编程任务的代码实现和实验报告。
## 代码实现
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <semaphore.h>
using namespace std;
sem_t sem1, sem2;
void ThreadHandler1()
{
while (true)
{
sem_wait(&sem1);
cout << "ThreadHandler1" << endl;
sem_post(&sem2);
}
}
void ThreadHandler2()
{
while (true)
{
sem_wait(&sem2);
cout << "ThreadHandler2" << endl;
sem_post(&sem1);
}
}
int main()
{
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
thread t1(ThreadHandler1);
thread t2(ThreadHandler2);
t1.join();
t2.join();
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
```
## 实验报告
### 实验目的
1. 了解信号量在多线程同步中的应用;
2. 掌握使用信号量实现多线程同步的方法和技术;
3. 熟悉信号量同步中的常见问题和解决方法。
### 实验原理
信号量是一种用于进程/线程同步的机制,它可以用来实现进程/线程之间的同步和互斥访问。信号量包括两种类型:二元信号量和计数信号量。二元信号量只有两种状态,一般用于互斥访问;计数信号量可以有多种状态,用于实现同步和互斥访问。
在本实验中,我们通过使用信号量来同步两个线程,使其交替执行。具体来说,我们使用两个信号量sem1和sem2来实现同步,其中sem1初始值为1,sem2初始值为0。当线程1执行完毕后,它会释放sem2信号量,使得线程2可以执行。当线程2执行完毕后,它会释放sem1信号量,使得线程1可以再次执行。
### 实验过程
首先,我们在主函数中初始化两个信号量sem1和sem2:
```c++
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
```
然后,我们创建两个线程t1和t2,并分别将ThreadHandler1和ThreadHandler2函数作为线程的执行函数:
```c++
thread t1(ThreadHandler1);
thread t2(ThreadHandler2);
```
在ThreadHandler1函数中,我们使用sem_wait函数等待sem1信号量,然后输出"ThreadHandler1"字符串,最后使用sem_post函数释放sem2信号量。在ThreadHandler2函数中,我们使用sem_wait函数等待sem2信号量,然后输出"ThreadHandler2"字符串,最后使用sem_post函数释放sem1信号量。
```c++
void ThreadHandler1()
{
while (true)
{
sem_wait(&sem1);
cout << "ThreadHandler1" << endl;
sem_post(&sem2);
}
}
void ThreadHandler2()
{
while (true)
{
sem_wait(&sem2);
cout << "ThreadHandler2" << endl;
sem_post(&sem1);
}
}
```
最后,我们在主函数中等待两个线程执行完毕,并销毁两个信号量:
```c++
t1.join();
t2.join();
sem_destroy(&sem1);
sem_destroy(&sem2);
```
### 实验总结
本实验通过使用信号量来实现多线程同步,使得两个线程可以交替执行。在实际应用中,需要根据具体的需求选择适当的同步方法,以保证程序的正确性和效率。同时,也需要注意信号量同步中可能出现的死锁和饥饿问题,以及如何解决这些问题。
阅读全文