gpt4 book ai didi

c++ - 执行不在线程之间切换 (c++11)

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:02 25 4
gpt4 key购买 nike

我是 C++11 多线程的初学者。我正在使用小代码并遇到了这个问题。这是代码:

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>

std::mutex print_mutex;

void function1()
{
std::cout << "Thread1 started" << std::endl;

while (true)
{
std::unique_lock<std::mutex> lock(print_mutex);
for (size_t i = 0; i<= 1000000000; i++)
continue;
std::cout << "This is function1" << std::endl;
lock.unlock();
}
}

void function2()
{
std::cout << "Thread2 started" << std::endl;
while (true)
{
std::unique_lock<std::mutex> lock(print_mutex);
for (size_t i = 0; i <= 1000000000; i++)
continue;
std::cout << "This is function2" << std::endl;
lock.unlock();
}
}

int main()
{
std::thread t1(function1);
std::thread t2(function2);

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

return 0;
}

我凭直觉编写了代码,期望得到以下输出:

Thread1 started
Thread2 started

This is function1
This is function2
This is function1
. .
.
.

但是显示的输出如下:

Thread1 started
Thread2 started

This is function1

This is function1
This is function1
.
.
.

我哪里错了?

最佳答案

解锁一个互斥锁并不能保证另一个正在等待锁定同一个互斥锁的线程会立即获得锁。

它只保证其他线程将尝试获取锁。

在这种情况下,在一个线程中解锁互斥量后,同一个线程将立即尝试再次锁定它。即使另一个线程在耐心等待,对于互斥量,也不能保证另一个线程这次会赢。刚刚锁定它的同一个线程可以成功地立即再次锁定它。

今天,您看到同一个线程总是赢得锁定竞赛。明天,您可能会发现它始终是另一个线程。无论如何,当有多个线程同时追求同一个互斥锁时,您无法保证哪个线程将获得互斥锁。获胜者取决于您的 CPU 和其他硬件架构、系统加载的繁忙程度、当时以及许多其他因素。

关于c++ - 执行不在线程之间切换 (c++11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29866043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com