我试图让我的主程序启动一个管理我程序部分的线程......所创建的线程为数组的每个元素创建一个子线程。子线程将数组元素设置为不可用,延迟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);
}
}
}
}
答案 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 functions或wiki