Sleep命令在子线程中不起作用

时间:2014-05-08 00:42:43

标签: c++ multithreading winapi sleep

我试图让我的主程序启动一个管理我程序部分的线程......所创建的线程为数组的每个元素创建一个子线程。子线程将数组元素设置为不可用,延迟10秒,然后将元素设置为可用。但是,主线程继续正常执行,直到数组元素可用。

但是,它似乎没有延迟......

请注意,该数组是一个全局数组。

我做错了什么?

下面的代码将概述我想要的更好的解释......

DWORD WINAPI SubThread(void* lpParam)
{
    int i = (int)lpParam;

    printf("Sub Thread Ran");

    structureArray[i].available= false;
    Sleep(10000);
    structureArray[i].available = true;
    return 0;
}

DWORD WINAPI MainThread(void * lpParam)
{
    while(true)
    {
        for(int i = 0; i < structureArray.size(); i++)
        {
            if(structureArray[i].available)
            {

                CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SubThread, (LPVOID)i, 0, NULL);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的全局变量似乎不是线程安全的。

尝试使用线程安全集合或自行锁定访问权限(解决方案是特定于Windows的,从您的WINAPI说明符推断):

class CriticalSection
{
public:
    CriticalSection()
        { ::InitializeCriticalSection(&m_cs); }
    ~CriticalSection()
        { ::DeleteCriticalSection(&m_cs); }

    void Enter()
        { ::EnterCriticalSection(&m_cs); }
    void Leave()
        { ::LeaveCriticalSection(&m_cs); }

private:
// private to prevent copying
    CriticalSection(const CriticalSection&);
    CriticalSection& operator=(const CriticalSection&);

    CRITICAL_SECTION m_cs;
};

class Lock
{
public:
    Lock(CriticalSection& a_section): m_section(a_section) 
    { m_section.Enter(); }
    ~Lock()
    { m_section.Leave(); }

private:
    Lock(const CSLock&);
    Lock& operator=(const CSLock&);
    CriticalSection& m_section;
};

CriticalSection g_dontUseGlobalCS;

DWORD WINAPI SubThread(void* lpParam)
{
    int i = (int)lpParam;

    printf("Sub Thread runs for...");

    Sleep(10000);

    { // use scope to destroy lock...
        Lock(g_dontUseGlobalCS);
        structureArray[i].available= true;
    } // exactly here

    // note: a new thread could already be running here
    // for debugging purposes add this:
    printf("10 seconds.");
    return 0;
}

DWORD WINAPI MainThread(void * lpParam)
{
    while(true)
    {
        for(int i = 0; i < structureArray.size(); i++)
        {
                    Lock(g_dontUseGlobalCS);
            if(structureArray[i].available)
            {
                        // set the thread availability here
                        structureArray[i].available = false;
                CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SubThread, (LPVOID)i, 0, NULL);
            }
        }
    }
}

我还将可用性标志的集合移动到创建者线程。通常你会使用其他机制来实现你想要做的事情: 查看windows synchronization functionswiki