【发布时间】:2016-11-29 22:22:36
【问题描述】:
我正在考虑如何实现一个包含私有数据的类,这些私有数据最终将由多个线程通过方法调用进行修改。对于同步(使用 Windows API),我计划使用 CRITICAL_SECTION 对象,因为所有线程都将从同一个进程产生。
鉴于以下设计,我有几个问题。
template <typename T> class Shareable
{
private:
const LPCRITICAL_SECTION sync; //Can be read and used by multiple threads
T *data;
public:
Shareable(LPCRITICAL_SECTION cs, unsigned elems) : sync{cs}, data{new T[elems]} { }
~Shareable() { delete[] data; }
void sharedModify(unsigned index, T &datum) //<-- Can this be validly called
//by multiple threads with synchronization being implicit?
{
EnterCriticalSection(sync);
/*
The critical section of code involving reads & writes to 'data'
*/
LeaveCriticalSection(sync);
}
};
// Somewhere else ...
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
Shareable<ActualType> *ptr = static_cast<Shareable<ActualType>*>(lpParameter);
T copyable = /* initialization */;
ptr->sharedModify(validIndex, copyable); //<-- OK, synchronized?
return 0;
}
在我看来,API 调用将在当前线程的上下文中进行。也就是说,我假设这与我从指针获取临界区对象并从ThreadProc() 中调用 API 相同。但是,我担心如果创建对象并将其放置在主/初始线程中,API 调用会有些奇怪。
- 当
sharedModify()同时在同一个对象上调用时, 从多个线程中,同步是否是隐式的,在 我上面描述的方式? - 我是否应该获得指向 临界区对象并改用它?
- 还有其他的吗 更适合这种情况的同步机制?
【问题讨论】:
标签: c++ multithreading winapi