jjzjj

C++ 可能的线程问题——可能是 Ogre 的错

我的代码中有一个非常奇怪的问题。我正在使用Ogre,我正在尝试手动创建Material,但我认为问题不是Ogre特有的。友情链接:Headerfile,Sourcefile,Stacktrace.请原谅随机名称、评论和std::cout如果您不想阅读,这里是我的代码摘要:创建根加载插件设置渲染系统加载资源设置输入系统创建场景管理器创建场景一种。设置灯光b.手动创建素材C。使用手动创建的Material将实体添加到场景添加帧更新回调开始渲染现在,如果我省略步骤7b和7c,代码将按预期正常工作,并且程序按预期输出到日志。但是,如果我包括步骤7b和7c,则什么也不会发生,也不会写入任何日志。

c++ - pthread广播然后等待?

我正在尝试设置多个线程处于等待状态,直到它们收到pthread_cond_broadcast()。完成一项工作后,我希望线程回到它们的等待状态。我还希望调用pthread_cond_broadcast()的进程在继续之前等待所有线程返回到它们的等待状态。在这种情况下,调用广播的是main()函数。我正在尝试让main(0在调用广播后执行pthread_cond_wait()。void*Work::job(void*id){intidx=(long)id;while(1){pthread_mutex_lock(&job_lock);while(!jobs_complete){//wait

C++ std lib <mutex>, <conditional_variable> 库和共享内存

如果您想在共享内存中的进程之间共享互斥体,POSIX线程的CAPI需要设置一个特殊标志-请参阅sem_init()。我真的不知道差异是什么,但我在尝试在共享内存中使用C++std::condition_variable时遇到了问题——它的段错误。我在C++文档或构造函数中看不到任何提及此内容的内容。我想知道如何/是否可以在共享内存中使用C++线程互斥锁。这是我的测试代码供引用。注意squeue只是一个简单的(POD)静态大小的循环队列,省略了不相关的内容:#include#include#include/*Formodeconstants*/#include/*ForO_*consta

c++ - 我如何为数组中的元素锁定 MUTEX,而不是为整个数组锁定

问题的简短版本:我有2个函数共享同一个数组,当一个正在编辑它时,另一个正在读取它。但是,vector很长(5000个样本)并且很少发生并发访问。但是MUTEX1上的Mutex争用正在减慢程序的速度。'如何锁定内存的某些位置而不是整个block以减少争用?编辑:注意:我必须尽可能使用更新的G值。EDIT2:例如我有长度为5000的数组G。foo1锁定mutex1以编辑索引124。虽然foo2想要编辑索引2349,它不能直到foo1释放mutex1。有没有办法可以将锁定互斥锁的争用下移到元素级别?意思是:我希望foo2和foo1只在同一个互斥锁上竞争,只有当他们想要编辑同一个索引时。例如:

c++ - 为什么共享锁只能持有一把可升级锁

Theboostdocumentationforupgradableandsharedlocks说当持有共享锁时,只有一个其他线程可以获得可升级的锁。因此,如果其他线程在共享锁与可升级锁一起持有时尝试获取可升级锁,它们将阻塞。当多个线程与一个(或多个共享锁)一起获取可升级锁时,是否存在我遗漏的死锁可能性?或者这只是一个合乎逻辑的要求(所以“不应该这样做”之类的事情)?请注意,我不是在谈论独占锁定状态。只有可升级的锁定状态。如果可升级锁与其他共享锁一起持有,则它本质上是一个READ锁。那为什么不能把两把可升级的锁放在一起呢? 最佳答案

c++ - std::atomic 用于内置类型 - 非无锁与琐碎的析构函数?

查看std::atomic这是我阅读的默认专业:Thesespecializationshavestandardlayout,trivialdefaultconstructors,andtrivialdestructors.我还阅读了is_lock_free:Allatomictypesexceptforstd::atomic_flagmaybeimplementedusingmutexesorotherlockingoperations,ratherthanusingthelock-freeatomicCPUinstructions.Atomictypesarealsoallowed

c++ - 在 C++11 线程中,std::mutex 对内存可见性有什么保证?

我目前正在尝试学习C++11线程API,但我发现各种资源都没有提供重要的信息:CPU缓存的处理方式。现代CPU的每个核心都有一个缓存(意味着不同的线程可能使用不同的缓存)。这意味着一个线程有可能将一个值写入内存,而另一个线程可能看不到它,即使它看到第一个线程也进行了其他更改。当然,任何好的线程API都提供了一些方法来解决这个问题。然而,在C++的线程api中,它是如何工作的并不清楚。我知道std::mutex,例如,以某种方式保护内存,但不清楚它的作用:它是否清除整个CPU缓存,是否清除从当前线程的缓存中清除互斥体内部访问的对象,或者其他什么?此外,显然,只读访问不需要互斥量,但是如果

C++ 11 : Mutex & Condition Variable Cannot be Copied

我是C++11的新手,正在使用线程。我遇到了一个无法复制互斥锁和条件变量对象的场景。代码是这样的....classproducer{public:producer(mutexm,condition_variablecv){mut=m;//ERRORcvar=cv;//ERROR}private:mutexmut;condition_variablecvar;}尝试在构造函数中复制变量时出现错误。似乎复制构造函数设置为deleteformutex和cv。有办法克服吗?我想要一个生产者和消费者类,然后从ma​​in函数传递互斥量和cv。所以基本上来自main函数的调用应该是这样的.....

c++ - 具有不可复制的 boost::mutex 的类的赋值运算符

我在这里读这个旧的BoostThreadFAQ其中有为具有boost::mutex不可复制对象作为成员的类实现复制构造和赋值运算符的指南。我对复制构造函数没意见,但我对赋值运算符有些怀疑。下面的指令还有效吗?//oldboostthreadconstcounter&operator=(constcounter&other){if(this==&other)return*this;boost::mutex::scoped_locklock1(&m_mutex&other.m_mutex?m_mutex:other.m_mutex);m_value=other.m_value;return

c++ - PThread 初学者 - 启动、同步、停止工作线程

我有以下经理员工情况:classManager{private:pthread_attr_tworkerSettings;pthread_tworker;pthread_cond_tcondition;pthread_mutex_tmutex;boolworkerRunning;staticvoid*worker_function(void*args){Manager*manager=(Manager*)args;while(true){while(true){pthread_mutex_lock(&manager->mutex);if(/*newdataavailable*/){/*