谷歌为"锁定免费载体"的第一个结果是Damian Dechev,Peter Pirkelbauer和Bjarne Stroustrup描述理论无锁向量的研究论文.这个或任何其他无锁向量是否已实现?
push_back, begin, end are described as concurrent safe in https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrent-vector-class?view=vs-2019#push_back
However the below code is asserting. Probably because element is added but not initialized yet.
struct MyData
{
explicit MyData()
{
memset(arr, 0xA5, sizeof arr);
}
std::uint8_t arr[1024];
};
struct MyVec
{
concurrency::concurrent_vector<MyData> v;
};
auto vector_pushback(MyVec &vec) -> void
{
vec.v.push_back(MyData{});
}
auto vector_loop(MyVec &vec) -> void
{
MyData myData;
for (auto it = vec.v.begin(); it != vec.v.end(); ++it)
{
auto res = memcmp(&(it->arr), &(myData.arr), sizeof myData.arr); …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试使用表示2D数组tbb::concurrent_vector<T>.这个2d数组将被许多不同的线程访问,这就是为什么我希望它能够最有效地处理并行访问.
我想出了两个解决方案:
用a tbb::concurrent_vector<tbb::concurrent_vector<T> >来存储它.
将所有内容存储在一个tbb::concurrent_vector<T>和访问元素中x * width + y
我偏爱第二个,因为我不想锁定整行来访问一个元素(因为我假设要访问该元素array[x][y],tbb实现将锁定第xth行然后锁定第th y个元素).
我想知道哪种解决方案对你来说更好.
c++ parallel-processing multithreading tbb concurrent-vector
使用:VC++ 2013
concurrency::concurrent_vector<datanode*> dtnodelst
Run Code Online (Sandbox Code Playgroud)
有时,当我这样做时dtnodelst->at(i).... 我收到一个无效地址 (0XCDCD.. ofc) 这不应该是我推回后的原因,我从不删除或删除任何它(即使我删除它应该已返回已删除的旧地址...但我从未删除,因此情况并非如此)
dtnodelst itm = new dtnodelst ();
....
dtnodelst->push_back(itm);
Run Code Online (Sandbox Code Playgroud)
关于可能发生什么的任何想法?
ps 我正在使用 Windows 线程池。有时.. 我可以做 800 万次插入和查找,一切顺利......但有时甚至 200 次插入和查找都会失败。我有点失落。任何帮助将不胜感激!
感谢和最好的问候
ps 我是否遗漏了某些东西,或者使用正确的格式对过去的代码感到痛苦?我记得它之前是自动对齐的... -_-
struct datanode {
volatile int nodeval;
T val;
};
concurrency::concurrent_vector<datanode*> lst
inline T find(UINT32 key)
{
for (int i = 0; i < lst->size(); i++)
{
datanode* nd = lst->at(i);
//nd is invalid sometimes
if (nd)
if (nd->nodeval == key)
{
return (nd->val);
}
}
return …Run Code Online (Sandbox Code Playgroud)