小编Kon*_*lph的帖子

线程安全矢量

首先让我说我已经阅读了关于这个主题的大部分SO和其他主题.

我理解的方式,std :: vector 在推回新项目时重新分配内存,这是我的情况,除非我保留了足够的空间(这不是我的情况).

我所拥有的是std :: shared_ptr的向量,并且该向量包含唯一对象(或者更准确地说,指向向量中的唯一对象).

通过指针处理这些对象是围绕Factory&Handler类进行的,但是可以从包装类外部访问指向对象的指针,并且可以修改成员值.任何时候都不会发生删除.

如果我正确理解先前关于std :: vector和线程安全的SO问题中提出的问题,添加(push_back)新对象可能会使先前的指针无效,因为向量内部可能会重新分配内存并复制所有内容,这当然是一场灾难为了我.

我的意图是从该向量读取,通常通过指针修改对象,并从异步运行的线程向向量添加新项.

所以,

  1. 使用原子或互斥是不够的?如果我从一个线程推回,另一个通过指针处理对象的线程可能最终有一个无效的对象?
  2. 是否有可以处理这种形式的MT问题的库?我一直在阅读的是英特尔的TBB,但由于我已经在使用C++ 11,我希望将更改保持在最低限度,即使这对我来说意味着更多的工作 - 我想在这个过程中学习,而不仅仅是复制粘贴.
  3. 除了在修改对象时锁定访问权限,我希望对向量的异步并行读取访问不会被push_backs无效.我怎样才能做到这一点?

如果它具有任何重要性,那么以上所有内容都是在linux(debian jessie)上使用gcc-4.8并启用了c ++ 11.

我愿意使用微创库.

提前谢谢了 :-)

c++ multithreading vector c++11

9
推荐指数
1
解决办法
1万
查看次数

检查文件中是否存在值

我正在尝试逐行读取以下文件并检查文件中是否存在值。我目前正在尝试的方法不起作用。我究竟做错了什么?

如果该值存在,我什么都不做。如果没有,那么我将它写入文件。

文件.txt:

123
345
234
556
654
654
Run Code Online (Sandbox Code Playgroud)

代码:

file = open("file.txt", "a+")
lines = file.readlines()
value = '345'
if value in lines:
    print('val ready exists in file')
else:
    # write to file
    file.write(value)
Run Code Online (Sandbox Code Playgroud)

python python-3.7

9
推荐指数
2
解决办法
1686
查看次数

如何输入注释字符串的长度?

我想在 python 中输入注释一个只​​接受单个字符的函数,例如:\n(s: str) -> int

\n

由于 Python 没有单个字符的类型,因此您不能只执行类似(s: char) -> int.

\n

有没有一种方法可以让键入的内容s: str只能是一个字符?

\n

我发现这对于编写代码时的提示很有用。

\n

这是我的完整示例:

\n
import unicodedata\n\nroman_numeral_lookup = {"I": 1, "V": 5, "X": 10, ...}\n\ndef exact_roman_numeral(s: str) -> int:\n    """Return the value of a single Roman numeral. Dosen\'t support multicharacter roman numerals such as \'XII\' or Apostrophus."""\n\n    # Convert Unicode Roman numerals into to their normalised text version. e.g. \xe2\x85\xa9 -> X, \xe2\x85\xb0 -> I\n    s = unicodedata.normalize("NFKC", s).upper()\n\n …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

9
推荐指数
1
解决办法
3319
查看次数

ICollection的合同<T> .IsReadOnly

我正在编写一个实现的数组包装器类IList<T>.不过,我不确定要返回什么IList<T>.IsReadOnly(继承自ICollection<T>).

我的班级不允许插入和删除.它不会允许通过修改物品this[int].set属性.

MSDN指出,

只读集合不允许在创建集合后添加,删除或修改元素.

对于我的班级来说,这似乎意味着我必须返回,true但在我眼中,这使得该属性成为了一个完全没用:据我所见,这种方法的使用方法如下:

客户端处理任意操作,IList并且如果可能的话,需要在其中插入元素.他们可以通过调用Insert和捕获结果来做到这一点NotSupportedException- 由于各种原因,这可能是不可取的.因此,客户可以IsReadOnly事先测试该属性,而不是激发异常.

但是这个属性的结果将是错误的,因为它将集合的可修改性与其内容的可修改性混合在一起 - 这是完全不相关的事情!

可以肯定的,还有的IList.IsFixedSize属性,但是这是一个独立的类型(IList<T>延伸IList).我该怎么办?还实现IList(我真的喜欢这个替代方案)?做点别的吗?

.net collections msdn

8
推荐指数
1
解决办法
864
查看次数

使用OpenMP原子操作进行获取和添加

我正在使用OpenMP,需要使用fetch-and-add操作.但是,OpenMP不提供适当的指令/调用.我想保留最大的可移植性,因此我不想依赖编译器内在函数.

相反,我正在寻找一种方法来利用OpenMP的原子操作来实现这一点,但我已经走到了尽头.甚至可以这样做吗?注意,以下代码几乎可以满足我的需求:

#pragma omp atomic
x += a
Run Code Online (Sandbox Code Playgroud)

几乎 - 但不完全,因为我真的需要旧的价值x.fetch_and_add应定义为产生与以下相同的结果(仅非锁定):

template <typename T>
T fetch_and_add(volatile T& value, T increment) {
    T old;
    #pragma omp critical
    {
        old = value;
        value += increment;
    }
    return old;
}
Run Code Online (Sandbox Code Playgroud)

(如果我没有弄错的话,可以要求一个等价的问题进行比较和交换,但可以用另一个来实现.)

c++ atomic openmp compare-and-swap

8
推荐指数
1
解决办法
6046
查看次数

在OS X上设置区域设置崩溃

以下代码在Linux上运行正常但在OS X 10.7上引发异常:

#include <iostream>
#include <locale>
#include <stdexcept>

int main() try {
    std::locale::global(std::locale(""));
    std::cout << "Using locale: " << std::locale().name() << "\n";
}
catch (std::runtime_error const& e) {
    std::cout << e.what() << "\n";
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

OS X上的输出是:

locale::facet::_S_create_c_locale 名称无效

但是,标准明确地说明了这一点

该组有效的字符串参数值的是"C",""和任何实现定义的值.

所以无论什么原因导致上述行为都违反了标准.

使用的编译器是clang ++ 3.1(tags/Apple/clang-318.0.58); 我也尝试过通过Homebrew安装的GCC 4.7,结果相同.

其他人可以验证这个问题吗?是什么导致的?我做错了吗?这是OS X中的错误吗?

(也许这与另一个xlocale问题有关,但错误实际上是完全不同的.)

c++ macos locale xlocale

8
推荐指数
1
解决办法
1196
查看次数

如何在构造函数中初始化类的成员数组?

我正在尝试执行以下操作:

class sig
{
public:

int p_list[4];
}

sig :: sig()
{
p_list[4] = {A, B, C, D};
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

缺少构造函数中的表达式.

那么我如何初始化一个数组呢?

c++

8
推荐指数
3
解决办法
3万
查看次数

如何将值与给定的对齐方式对齐

我有一个值,我想要对齐给定的对齐,即如果尚未对齐,则将值增加到对齐的下一个倍数.

在C++中执行此操作的简洁方法是什么?

例如

int x;
int alignment;
int y = ???; // align x to alignment
Run Code Online (Sandbox Code Playgroud)

c++ math

8
推荐指数
1
解决办法
4108
查看次数

错误C2280:'std :: thread :: thread(const std :: thread&)':尝试引用已删除的函数

我在尝试创建使用C++ 11标准线程的VC++静态库时遇到问题.

我目前有两个类,我能够声明并稍后在我的起始类(最后声明的)上定义一个线程.在此阶段,代码只是一个套接字侦听器,然后创建另一个类的对象来处理接受的每个客户端.这些子对象应该创建并行数据捕获,编码和传输所需的线程.

问题是:如果我在我的另一个类上声明一个std :: thread,即使我完全像在我的start类上那样,无论如何,我在构建时遇到这个错误 error C2280: 'std::thread::thread(const std::thread &)' : attempting to reference a deleted function [...]\vc\include\functional 1124 1

我能够解决这个错误的唯一方法是std::thread根据我想要它做的事情,根本不在后一个类中声明一个对象,这是不可能的.

我正在使用VS2013,我的来源是:

stdafx.h中

#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
#include <Windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <thread>
#include <iostream>
#include <vector>
Run Code Online (Sandbox Code Playgroud)

StreamServer.h

#pragma once
#define DEFAULT_BUFLEN 65535
#define DEFAULT_PORT "5649"

class StreamServerClient
{
public:
    bool* terminate;
    //std::thread client;     //If I comment this line out, it builds just fine.
    void DoNothing(); …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading visual-c++ c++11 visual-studio-2013

8
推荐指数
2
解决办法
9088
查看次数

在 Shiny 应用程序中找不到静态图像(HTTP 状态 404)

我正在尝试将静态图像放入闪亮的应用程序中。www我在 Shiny 应用程序的工作目录中创建了一个名为的文件夹,并在其中放置了一个 PNG 文件。使用以下代码应该显示图像:

\n
library(shiny)\n\nui <- fluidPage(\n  tags$img(src=\'photo.png\')\n)\n  \nserver <- function(input, output) {}\n\nshinyApp(ui=ui, server=server)\n
Run Code Online (Sandbox Code Playgroud)\n

但我有这个:

\n

在此输入图像描述

\n

查询图片URL( http://127.0.0.1:7122/photo.png)直接显示404状态码。

\n

无论我是通过手动运行代码、单击 RStudio 中的“运行应用程序”按钮还是通过执行文件来启动 Shiny 应用程序,结果都是相同的Rscript app.R命令行执行文件来启动 Shiny 应用程序,结果都是相同的。

\n

这是文件夹结构:

\n
library(shiny)\n\nui <- fluidPage(\n  tags$img(src=\'photo.png\')\n)\n  \nserver <- function(input, output) {}\n\nshinyApp(ui=ui, server=server)\n
Run Code Online (Sandbox Code Playgroud)\n

我错过了什么吗?

\n

r shiny

8
推荐指数
1
解决办法
8018
查看次数