假设xxx类不是线程安全的类,不能够同时被多个线程使用,那么可以参考下面的方法来提高并发其性。假设线程池的容量是EPF_POOL_SIZE,则可以先创建EPF_POOL_SIZE*2个xxx类,如下,
int limit = 2*EPF_POOL_SIZE;
vector<shared_ptr<xxx> > sc_arr;
for (int i = 0; i < limit; i++) {
shared_ptr<Safe_Cropping> sc(new xxx());
sc_arr.push_back(sc);
}
在使用xxx类的时候可参照如下方法,
//Generate the random number
boost::mt19937 rng(time(0));
boost::uniform_int<> ui(0, limit - 1);
... ...
int index = ui(rng);
shared_ptr<xxx> irc = sc_arr->at(index)->ipc_roi_crop;
sc_arr->at(index)->mut.lock();
irc->doing();
sc_arr->at(index)->mut.unlock();
上述方法的本质思想是采用空间换时间的思路,预先创建大量的备用对象,在需要的时基于随机算法获取实例,并使用锁来确保互斥访问,从而使线程不安全的类能以大并发的方式运行。