在这段代码中,我首先创建一个始终保持运行的线程。然后我创建对象并将它们逐个添加到队列中。线程从队列中逐个拾取对象并对其进行处理并删除它们。
class MyClass
{
public:
MyClass();
~MyClass();
Process();
};
std::queue<class MyClass*> MyClassObjQueue;
void ThreadFunctionToProcessAndDeleteObjectsFromQueue()
{
while(1)
{
// Get and Process and then Delete Objects one by one from MyClassObjQueue.
}
}
void main()
{
CreateThread (ThreadFunctionToProcessAndDeleteObjectsFromQueue);
int N = GetNumberOfObjects(); // Call some function that gets value of number of objects
// Create objects and queue them
for (int i=0; i<N; i++)
{
try
{
MyClass* obj = NULL;
obj = new MyClass;
MyClassObjQueue.push(obj);
}
catch(std::bad_alloc&)
{
if(obj)
delete obj;
}
}
// Wait till all objects have been processed and destroyed (HOW ???)
}
问题:
在我退出之前,我不确定如何处理所有对象。一种方法是使用while(1)
循环和Sleep
定期继续检查队列大小。但我认为这是做事的新手。我真的想通过使用线程同步对象(例如semaphore
等)以优雅的方式完成它,以便同步函数将等待所有对象完成。但不知道该怎么做。任何意见都将不胜感激。
(注意:我没有在上面的代码中使用同步对象来添加/删除queue
。这只是为了保持代码简单和可读。我知道STL容器不是线程安全的)< / p>