使用线程互斥锁实现以下功能:主线程和子线程共享一个字符数组作为数据存储区,子 线程接收来自键盘输入的字符串,主线程中读取字符串并输出字符串和字符串的长度。 当主 线程判断收到 end 字符串,则结束程序 。
时间: 2023-11-27 18:54:45 浏览: 159
Linux多线程使用互斥量同步线程
下面是使用线程互斥锁实现的代码示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <cstring>
using namespace std;
const int MAX_LEN = 100; // 字符数组最大长度
char data[MAX_LEN]; // 数据存储区
mutex data_mutex; // 互斥锁
bool end_flag = false; // 结束标志
// 子线程函数:接收键盘输入的字符串
void input_thread_func()
{
while (true)
{
string s;
getline(cin, s); // 从键盘读入一行字符串
{
lock_guard<mutex> lock(data_mutex); // 获取互斥锁
if (s == "end")
{
end_flag = true; // 若输入字符串为 "end",则设置结束标志并退出循环
break;
}
else
{
strncpy(data, s.c_str(), MAX_LEN); // 将输入字符串复制到数据存储区
}
}
}
}
// 主线程函数:读取字符串并输出字符串和字符串的长度
void output_thread_func()
{
while (true)
{
{
lock_guard<mutex> lock(data_mutex); // 获取互斥锁
if (end_flag) // 若已经设置结束标志,则退出循环
{
break;
}
else
{
cout << "Received string: " << data << endl; // 输出字符串
cout << "String length: " << strlen(data) << endl; // 输出字符串长度
}
}
this_thread::sleep_for(chrono::milliseconds(100)); // 休眠 100 毫秒,避免输出过快
}
}
int main()
{
thread input_thread(input_thread_func); // 创建子线程
thread output_thread(output_thread_func); // 创建主线程
input_thread.join(); // 等待子线程结束
output_thread.join(); // 等待主线程结束
return 0;
}
```
在上面的代码中,我们定义了一个全局的字符数组 `data` 作为数据存储区,一个互斥锁 `data_mutex` 用于保护该数据存储区的访问,以及一个结束标志 `end_flag`。首先,我们创建一个子线程 `input_thread`,在该线程中不断循环读取键盘输入的字符串,并将其复制到数据存储区中。当输入的字符串为 "end" 时,设置结束标志并退出循环。接着,我们创建一个主线程 `output_thread`,在该线程中不断循环读取数据存储区中的字符串,并输出字符串和字符串的长度。当结束标志被设置时,退出循环,程序结束。
需要注意的是,在读取和写入数据存储区时,必须先获取互斥锁,以保证线程安全。在上面的代码中,我们使用了 `lock_guard` 类来自动获取和释放互斥锁,避免了手动调用 `lock()` 和 `unlock()` 函数的麻烦。此外,在输出字符串和字符串长度后,我们使用了 `this_thread::sleep_for()` 函数来休眠一段时间,避免输出过快导致界面混乱。
阅读全文