Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该同步还是不同步_C++_C_Multithreading_Deque - Fatal编程技术网

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
就可以了,因为Thread1Thread2正在访问
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-如果有疑问,不要编写代码;解决疑问。存在可供使用的并发队列(例如),您应该使用它们,而不是为自己执行同步。存在可供使用的并发队列(例如),您应该使用它们,而不是为自己执行同步。