Multithreading 将作业发送到std::线程

Multithreading 将作业发送到std::线程,multithreading,c++11,mutex,stdthread,Multithreading,C++11,Mutex,Stdthread,我对std::thread非常陌生,我很快意识到,至少在我运行W7的计算机上创建它们是非常昂贵的。 因此,我决定创建线程,并使用这段示例代码向其发送作业: 我的代码运行良好,没有崩溃,但是我没有注意到性能有多大提高,所以我测量了作业完成时间与主线程检测到作业完成时间之间的差异(请参见WaitUntilJobFinished()),我注意到在一些罕见的情况下,时间差超过2毫秒 有人看到代码有什么问题吗 代码: 类参数 { 公众: }; typedef void(*CJobFunc)(常量CJobP

我对std::thread非常陌生,我很快意识到,至少在我运行W7的计算机上创建它们是非常昂贵的。 因此,我决定创建线程,并使用这段示例代码向其发送作业:

我的代码运行良好,没有崩溃,但是我没有注意到性能有多大提高,所以我测量了作业完成时间与主线程检测到作业完成时间之间的差异(请参见WaitUntilJobFinished()),我注意到在一些罕见的情况下,时间差超过2毫秒

有人看到代码有什么问题吗

代码:

类参数
{
公众:
};
typedef void(*CJobFunc)(常量CJobParameters*);
类CThread
{   
公众:
void Start();
void WaitUntilJobDone();
void StartJob(CJobFunc inJobFunc,常量CJobParameters*inJobParameters);
std::线程m_stdThread;
CJobFunc m_jobFunc=nullptr;
常量CJobParameters*m_jobParameters=nullptr;
//std::原子m_jobDone=true;
std::mutex m_mutex;
std::条件变量m_cv;
__int64 m_jobDoneAt=0;
__int64 m_螺纹接头AT=0;
__int64 m_lostTime=0;
};
类CThreads
{
公众:
静态void Start();
静态CThread threadArray[JOB_COUNT];
};
void ThreadMain(CThread*inThread)
{
while(true)
{
std::unique_lock lk(inThread->m_mutex);
inThread->m_cv.wait(lk,[inThread]{return inThread->m_jobParameters!=nullptr;});
if(inThread->m_jobFunc)
{
(*inThread->m_jobFunc)(inThread->m_jobParameters);
inThread->m_jobFunc=nullptr;
inThread->m_jobParameters=nullptr;
inThread->m_jobDoneAt=COSToolbox::QuerySystemTime2();
}
lk.unlock();
inThread->m_cv.notify_one();
std::this_线程::sleep_for(std::chrono::纳秒(0));
}
}
void CThread::StartJob(CJobFunc inJobFunc,const CJobParameters*inJobParameters)
{
std::lock_guard lk(mutex);
m_jobFunc=inJobFunc;
m_jobParameters=inJobParameters;
m_cv.通知_one();
}
void CThread::Start()
{
m_stdThread=std::thread(ThreadMain,this);
}
void CThread::WaitUntilJobDone()
{
std::唯一锁lk(m_互斥);
m_cv.wait(lk,[this]{返回this->m_jobParameters==nullptr;});
m_threadJoinedAt=COSToolbox::QuerySystemTime2();
m_lostTime=m_threadJoinedAt-m_jobDoneAt;
日志信息(“与%f ms lost连接的线程”,(Float32)m\u lostTime/1000);
}
CThread CThreads::threadArray[JOB_COUNT];
void CThreads::Start()
{
对于(Int32 i=0;i
两件事:

您将无条件地占用处理器时间,在一些旧版本的windows上,您将占用整个进程,而不仅仅是线程:

std::this_thread::sleep_for( std::chrono::nanoseconds(0) );
这种产量是不必要的。我怀疑你这样做的原因是,如果没有它,你会得到一个自旋循环,这是因为你正在读写一个条件变量


您需要两个条件变量,一个用于待处理的工作,另一个用于已完成的工作。通常,侦听器会将条件变量或包含它的结构作为参数传递给线程函数,从而允许您从调度程序传递单个条件变量。

谢谢您的回答。一旦我有时间尝试,我会给你回复的。好吧,很明显我的2毫秒是我自己的错误。现在我已经将时间减少到最多0.2毫秒。这是很多。我也删除了收益率,但它没有改变任何事情。我不知道我为什么需要两个条件变量。此示例仅使用一个等待两个不同布尔值来实现它:。我想如果是一个布尔,那也没什么区别。
std::this_thread::sleep_for( std::chrono::nanoseconds(0) );