我正在尝试使用线程和信号量来修复我的应用程序中的性能问题。
问题1:
用户点击一些复选框。每次单击一个复选框时,都会在数据库中进行一些密集的保存。用户投诉很慢。所以现在,当他们点击复选框时,我只是启动一个执行保存的线程(无需等待线程完成)。这一段时间还可以。
问题2:
当用户快速而不幸时,有时数据库中的保存会崩溃,因为同时另一个线程正试图保存在完全相同的表中。所以我认为我们需要的是信号量,但我不确定。
我想要的是这件事:
用户点击复选框1 启动线程1 用户单击复选框2 启动线程2(等待线程1完成) 线程1完成 线程2完成
这是我的代码:
我们调用的函数启动线程
bool SampleSO::ExecuteThreadSauvegarde()
{
//Créer le thread
CWinThread* pThreadSauvegarde = AfxBeginThread(ExecuteThreadSauvegarde, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if(pThreadSauvegarde)
{
pThreadSauvegarde->m_bAutoDelete = TRUE;
pThreadSauvegarde->ResumeThread();
}
return true;
}
然后由前一个函数调用的函数(静态)
UINT SampleSO::ExecuteThreadSauvegarde(LPVOID pParam)
{
SampleSO* pSampleSO = (SampleSO*)pParam;
LONG dwSemCount;
HANDLE hSemaphore = OpenSemaphore( SYNCHRONIZE |SEMAPHORE_MODIFY_STATE, FALSE, _T("Sauvegarde") );
//this is the function that call the saving
pSampleSO->Sauvegarde();
ReleaseSemaphore(hSemaphore, 1, &dwSemCount);
return 1;
}
如何修改我的代码,以便关键部分当时只访问一个线程,并且等待信号量的线程一发布就会进入临界区(当时一个)。 / p>
谢谢!
答案 0 :(得分:2)
你需要的不是那么多线程。相反,产生一个工作线程来处理数据库操作。当用户单击时,只需通过队列将消息/命令发布到工作线程。工作者只是等待命令,执行它,然后返回阻塞等待队列。除了队列本身的线程安全之外,这将不需要同步,这将是微不足道的,因为它是单生产者,单一消费者。