C++ 我应该同步还是不同步
我有一个C++ 我应该同步还是不同步,c++,c,multithreading,deque,C++,C,Multithreading,Deque,我有一个deque,在C++应用程序中包含指针。我知道有两个线程可以访问它 Thread1将从后面添加指针,Thread2将从前面处理和删除指针 Thread2将等待deque达到一定数量,即10项,然后开始处理。它一次只能循环和处理10个项目。与此同时,Thread1可能仍会继续向deque中添加新项目 我认为不同步deque就可以了,因为Thread1和Thread2正在访问deque的不同部分。它是deque而不是vector。因此,容器的现有内存不会被重新分配 我说得对吗?如果没有,为什
deque
,在C++应用程序中包含指针。我知道有两个线程可以访问它
Thread1将从后面添加指针,Thread2将从前面处理和删除指针
Thread2将等待deque
达到一定数量,即10项,然后开始处理。它一次只能循环和处理10个项目。与此同时,Thread1可能仍会继续向deque中添加新项目
我认为不同步deque
就可以了,因为Thread1和Thread2正在访问deque
的不同部分。它是deque
而不是vector
。因此,容器
的现有内存不会被重新分配
我说得对吗?如果没有,为什么(我想知道我错过了什么)
编辑:
我知道总是同步它不会有什么坏处。但这可能会影响性能,或者没有必要。如果可能的话,我只想让它运行得更快、正确。开发者必须跟踪它有多少元素以及这些元素在哪里。添加元素会更改存储的数据,删除元素也会更改存储的数据。在不同步的情况下从两个线程更改该数据是一种数据竞争,并产生未定义的行为
简而言之,您必须同步这些操作。deque必须跟踪它有多少个元素以及这些元素在哪里。添加元素会更改存储的数据,删除元素也会更改存储的数据。在不同步的情况下从两个线程更改该数据是一种数据竞争,并产生未定义的行为
简而言之,您必须同步这些操作。通常,标准库容器不能被认为是线程安全的,除非您所做的只是从它们中读取 如果您在
deque
implementation中查看封面下的内容,您将发现类似的内容:
template <typename T>
class deque {
public:
private:
static size_t const BufferCapacity = /**/;
size_t _nb_available_buffer;
size_t _first_occupied_buffer;
size_t _last_occupied_buffer;
size_t _size_first_buffer;
size_t _size_last_buffer;
T** _buffers; // heap allocated array of
// heap allocated arrays of fixed capacity
}; // class deque
模板
德克级{
公众:
私人:
静态大小常数缓冲容量=/**;
大小\u t\u nb\u可用\u缓冲区;
大小\u t\u第一个\u占用的\u缓冲区;
大小\u t\u最后占用的\u缓冲区;
大小\u t\u大小\u第一个\u缓冲区;
大小\u t\u大小\u最后一个\u缓冲区;
T**u buffers;//堆分配的
//堆分配的固定容量数组
}; // 德克级
你看到问题了吗\u缓冲区
,至少可以由入队和出队操作同时访问(特别是当阵列变得太小,需要在更大的阵列中复制时)
那么,替代方案是什么?您要查找的是一个并发队列。这里有一些实现,您可能不应该太担心它们是否是无锁的,除非它被证明是一个瓶颈。例如
我建议不要创建您自己的无锁队列,即使您听说这是一种时尚,因为我看到的所有第一个实现都有(有时是微妙的)竞争条件。一般来说,标准库容器不能被认为是线程安全的,除非您所做的一切都是从它们读取 如果您在
deque
implementation中查看封面下的内容,您将发现类似的内容:
template <typename T>
class deque {
public:
private:
static size_t const BufferCapacity = /**/;
size_t _nb_available_buffer;
size_t _first_occupied_buffer;
size_t _last_occupied_buffer;
size_t _size_first_buffer;
size_t _size_last_buffer;
T** _buffers; // heap allocated array of
// heap allocated arrays of fixed capacity
}; // class deque
模板
德克级{
公众:
私人:
静态大小常数缓冲容量=/**;
大小\u t\u nb\u可用\u缓冲区;
大小\u t\u第一个\u占用的\u缓冲区;
大小\u t\u最后占用的\u缓冲区;
大小\u t\u大小\u第一个\u缓冲区;
大小\u t\u大小\u最后一个\u缓冲区;
T**u buffers;//堆分配的
//堆分配的固定容量数组
}; // 德克级
你看到问题了吗\u缓冲区
,至少可以由入队和出队操作同时访问(特别是当阵列变得太小,需要在更大的阵列中复制时)
那么,替代方案是什么?您要查找的是一个并发队列。这里有一些实现,您可能不应该太担心它们是否是无锁的,除非它被证明是一个瓶颈。例如
我建议不要创建您自己的无锁队列,即使您听说这是一种时尚,因为我看到的所有第一个实现都有(有时是微妙的)竞争条件。我想您应该在有疑问时始终使用同步。是的,您应该同步。听起来您想要一个无锁队列,不是???@bash.d的std::deque.Dupe-如果有疑问,不要编写代码;解决疑问。我想你应该在有疑问的时候始终使用同步。是的,你应该同步。听起来你想要的是一个无锁队列,而不是???@bash.d的std::deque.Dupe-如果有疑问,不要编写代码;解决疑问。存在可供使用的并发队列(例如),您应该使用它们,而不是为自己执行同步。存在可供使用的并发队列(例如),您应该使用它们,而不是为自己执行同步。