我在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;
}
这只是一个典型的死锁:主线程获得锁,然后阻止连接另一个线程,但另一个线程只有在成功获得锁的情况下才能连接。
如果按如下方式切换到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多线程 线程组原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 线程组 线程组可以批量管理线程和线程组对象。 一级关联 例子如下,建立一级关联。 输出结果如下 每隔三秒输出两个线程名称,符合预期。 线程组自动归组属性 输出结果如下 没有指定线程组,则归属到当前线程所属的组。 根线程组 运行结果 当前线程的线程组的父线程组是系统