启动信号量释放后立即启动的线程

时间:2014-09-08 12:46:02

标签: c++ multithreading semaphore

我正在尝试使用线程和信号量来修复我的应用程序中的性能问题。

问题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>

谢谢!

1 个答案:

答案 0 :(得分:2)

你需要的不是那么多线程。相反,产生一个工作线程来处理数据库操作。当用户单击时,只需通过队列将消息/命令发布到工作线程。工作者只是等待命令,执行它,然后返回阻塞等待队列。除了队列本身的线程安全之外,这将不需要同步,这将是微不足道的,因为它是单生产者,单一消费者。