当前位置: 首页 > 知识库问答 >
问题:

线程C11无法解释原因

汪同
2023-03-14

我在Ubuntu13.04桌面上运行这个非常简单的程序,但是如果我注释掉sleep_for一行,它会在从main打印cout后挂起。有人能解释为什么吗?据我所知,main是一个线程,t是另一个线程,在本例中,互斥体管理共享cout对象的同步。

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

using namespace std;
std::mutex mu;

void show()
{
 std::lock_guard<mutex> locker(mu);
 cout<<"this is from inside the thread"<<endl;
}

int main()
{
 std::thread t(show);
 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
 std::lock_guard<mutex> locker(mu);
 cout<<"This is from inside the main"<<endl;
 t.join();
 return 0;
}

共有2个答案

虞安康
2023-03-14

这只是一个典型的死锁:主线程获得锁,然后阻止连接另一个线程,但另一个线程只有在成功获得锁的情况下才能连接。

商绍元
2023-03-14

如果按如下方式切换到main功能,代码将按预期工作:

int main()
{
    std::thread t(show);
    {
        std::lock_guard<mutex> locker(mu);
        cout << "This is from inside the main" << endl;
    } // automatically release lock
    t.join();
}

在您的代码中,存在一个不幸的竞争条件。如果线程t首先获得锁,则一切正常。但是,如果主线程首先获得锁,它将保持锁,直到main函数结束。这意味着,线程t没有机会获得锁,无法完成,主线程将阻塞t.join()

 类似资料:
  • 我对最新gcc中基于pthread和Ubuntu开发环境的线程的互斥锁和消息传递的性能感兴趣。一个很好的通用问题是用餐哲学家,每个哲学家使用lh和rh叉子与左右手邻居共享。我把哲学家的数量增加到99个,让我的四核处理器保持忙碌。 上面的代码允许我的哲学家尝试抓住他们需要的两个叉子。 上面的代码监控我的哲学家的进食或思考进度,这取决于他们是否能够保留这两个叉子。 在所有哲学家尝试自由选择后,等待所有

  • 使用脚本上焦点中定义的全局变量 t0=时间。时间是全球性的 这个函数呢 返回("["str(time.time()-t0) "] ") ## 从初始开始的时间戳 我正在尝试使用 打印(时间戳(t0)”。。。无论什么"") 这是可行的,但是当我通过 thread_id范围(win32-safe_os): ... p=进程(目标=fonction,args=((thread_id),测试)) ...p

  • 本文向大家介绍Java多线程start()方法原理解析,包括了Java多线程start()方法原理解析的使用技巧和注意事项,需要的朋友参考一下 1、为什么启动线程不用run()方法而是使用start()方法 run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样 而start()是创建线程等一系列工作,然后自己调用run里面的任务内容。 验证代码: 结果: main Thread-

  • 问题内容: 我想知道是否有人可以指出有关解释用提取的Java线程堆栈的信息。 我的情况是我在GlassFish v2.1.1上运行了一个Java EE 5应用程序,该应用程序定期挂起(每天至少挂2次-3次)。要使其再次运行,我必须终止Glassfish进程并重新启动域。 。应用程序通常会变得越来越慢,直到最终完全挂起。一旦挂起,我将无法获得线程堆栈。我已经能够获得一个线程堆栈,因为它变得越来越慢,

  • 我正在学习Hibernate,但当我尝试使用Brandid进行筛选时,我不断得到以下错误: 这是我在mysql中的2个表 } 有人能告诉我我做错了什么吗

  • 本文向大家介绍Java多线程 线程组原理及实例详解,包括了Java多线程 线程组原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 线程组 线程组可以批量管理线程和线程组对象。 一级关联 例子如下,建立一级关联。 输出结果如下 每隔三秒输出两个线程名称,符合预期。 线程组自动归组属性 输出结果如下 没有指定线程组,则归属到当前线程所属的组。 根线程组 运行结果 当前线程的线程组的父线程组是系统