c++版本 两个线程交替打印1~100

分析

两个线程要交替严格按照顺序打印数字1~100,那么两个线程之间必然进行通信,而线程之间进行通信的手段一般是条件变量。
其次,线程交替打印:1,2,3,…,100,那么一个线程打印奇数,一个打印偶数。

代码

#include <mutex>
#include <thread>
#include <iostream>
#include <functional>
#include <condition_variable>
#include <atomic>

std::mutex mtx_;
int count_ = 1;
const int maxNum_ = 100;
std::condition_variable cond_;

bool isOdd(const int num)
{
    return (num%2 != 0);
}

bool isEven(const int num)
{
    return !isOdd(num);
}

void print(int tid, std::function<bool(int)> calcFunc)
{
    int num = 0;
    do
    {
        {
            std::unique_lock<std::mutex> lock(mtx_);
            cond_.wait(lock, [&num, &calcFunc](){
                num = count_;
                return calcFunc(count_);
            });
        }
        
        std::cout << "tid[" << tid << "]: " << num << "\n"; //
        count_ += 1;
        cond_.notify_one();
    }while (num < maxNum_ - 1);
}

int main()
{
	std::thread tid1(print, 1, isOdd);
	std::thread tid2(print, 2, isEven);

	tid1.join();
	tid2.join();

	return 0;
}

关键分析:

std::cout << "tid[" << tid << "]: " << num << "\n"; //
count_ += 1;        
cond_.notify_one(); 

上述三行代码,顺序不能乱,一旦顺序乱了,就不能按照要求进行打印.

如果将第2行放到第一行,即先+1再打印, 刚执行完+1,操作系统虚假唤醒另一个线程,check条件满足,就往下执行了,造成乱序打印。

同理,如果将第一行放到第三行之后,先发出信号,另一个正被阻塞的线程收到信号以后,条件满足,执行后续的打印,与我们的打印造成乱序。

扩展: 多个线程进行交替打印

如果增加到三、四…多个线程来打印,本质还是不变,只需要增加每个线程的“条件“即可
如,五个线程交替打印:

#include <mutex>
#include <thread>
#include <iostream>
#include <functional>
#include <condition_variable>
#include <atomic>

std::mutex mtx_;
int count_ = 1;
const int maxNum_ = 100;
std::condition_variable cond_;

void print1(const int tid, std::function<bool(const int, const int)> calcFunc)
{
    int num = 0;
    do
    {
        {
            std::unique_lock<std::mutex> lock(mtx_);
            cond_.wait(lock, [&num, tid, &calcFunc](){
                num = count_;
                return calcFunc(num, tid);
            });
        }

        std::cout << "tid[" << tid << "]: " << num << "\n"; //
        count_ += 1;
        cond_.notify_all();
    }while (num < maxNum_ - 4);
}

bool isEqual(const int count, const int num)
{
    return ((count-1) % 5) == num;
}

int main()
{
	std::thread tid1(print1, 0, isEqual);
	std::thread tid2(print1, 1, isEqual);
	std::thread tid3(print1, 2, isEqual);
	std::thread tid4(print1, 3, isEqual);
	std::thread tid5(print1, 4, isEqual);

	tid1.join();
	tid2.join();
	tid3.join();
	tid4.join();
	tid5.join();
	
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个 C++ 示例代码,实现了使用两个线程交替读取两个文本文件的内容并输出到一个新文件: ```c++ #include <iostream> #include <fstream> #include <string> #include <thread> #include <mutex> using namespace std; mutex mtx; // 用于保护输出文件的互斥锁 void read_file(string file_name, vector<string>& output_list) { ifstream fin(file_name); if (fin.is_open()) { string line; while (getline(fin, line)) { mtx.lock(); // 加锁 output_list.push_back(line); mtx.unlock(); // 解锁 } } fin.close(); } void write_file(vector<string>& output_list) { ofstream fout("output.txt"); if (fout.is_open()) { for (int i = 0; i < output_list.size(); i++) { mtx.lock(); // 加锁 fout << output_list[i] << endl; mtx.unlock(); // 解锁 } } fout.close(); } int main() { string file1 = "file1.txt"; string file2 = "file2.txt"; vector<string> output_list; thread t1(read_file, file1, ref(output_list)); thread t2(read_file, file2, ref(output_list)); t1.join(); t2.join(); thread t3(write_file, ref(output_list)); t3.join(); return 0; } ``` 这个代码中,我们定义了两个函数 `read_file` 和 `write_file`,分别用于读取文件和写入文件。在 `read_file` 函数中,我们使用互斥锁来保护共享的 `output_list` 容器,以保证线程安全。在 `write_file` 函数中,我们同样使用互斥锁来保护输出文件操作的线程安全。 在 `main` 函数中,我们定义了两个线程 `t1` 和 `t2`,分别用于读取两个文件的内容,并将结果保存到 `output_list` 容器中。然后,我们再定义一个线程 `t3`,用于将 `output_list` 中的内容按行交替输出到文件中。最后,我们调用 `join` 函数等待线程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值