C++ 中的多线程无法正常工作

问题描述 投票:0回答:1

我正在尝试运行两个线程。第一个将无限运行,另一个将在第一个上的互斥锁被清除时运行。 我不想改变代码的基本结构,比如循环应该在一个线程中。它应该是无限的。

问题是我无法处理thread2。

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex myMutex;

void thread1Function() {
    std::cout << "Thread 1 started." << std::endl;
    for (int i = 0; i < 5; ++i) {
        {
            std::lock_guard<std::mutex> lock(myMutex);
            std::cout << "t1" << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    std::cout << "Thread 1 finished." << std::endl;
}

void thread2Function() {
    std::cout << "Thread 2 started." << std::endl;
    {
        std::lock_guard<std::mutex> lock(myMutex);
        std::cout << "t2" << std::endl;
    }
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Thread 2 finished." << std::endl;
}

int main() {
    std::thread t1(thread1Function);
    std::thread t2(thread2Function);

    t1.join();
    t2.join();

    return 0;
}

这是我实现的基本代码。此代码仅将数据打印为 t2、t1、t1...,并且仅打印 t1 直到循环结束。

有人可以帮我解决这个问题吗?两个线程都必须运行。

multithreading c++17 mutex
1个回答
0
投票

看起来像是饥饿的经典案例。大多数线程库中的互斥锁并不公平。也就是说,当两个线程都想要锁定同一个互斥量时,无法保证等待时间最长的线程将被授予该互斥量。

事实上,事实往往恰恰相反。大多数桌面/服务器/移动操作系统的设计目标是最有效地利用 CPU。在两个线程中,线程释放互斥体后发生的下一件事是,它尝试再次锁定它。在您的示例中,如果线程 2 处于睡眠状态,并在线程 1 释放互斥体时等待互斥体,则线程 1 很可能会在操作系统考虑唤醒线程 2 之前再次获取互斥体。如果操作系统调度策略最大限度地减少“切换上下文”的次数(即,将一个线程置于睡眠状态,并唤醒另一个人。)

© www.soinside.com 2019 - 2024. All rights reserved.