线程安全的向量和字符串容器?

2024-03-28

我之前发过一个问题“在嵌入式 Linux 平台上使用 std::string 时出现段错误” https://stackoverflow.com/questions/2412667/seg-fault-when-using-stdstring-on-an-embedded-linux-platform在那里我得到了一些非常有用的建议。从那时起我就离开了其他项目,最近又开始关注这个问题。

重申一下,我只能使用 arm-linux 交叉编译器(版本 2.95.2),因为这是嵌入式平台供应商提供和支持的。我知道这个问题可能是因为 stdlib 非常旧,并且线程不是特别安全。

问题是,每当我在多个线程中使用 STL 容器时,我都会遇到分段错误。下面的代码将始终出现 seg 错误,除非我在容器声明周围使用 pthread_mutex_lock 和作用域运算符(如其他帖子中所示)。

在我的应用程序中使用这种方法是不可行的,因为我将容器传递给不同的方法和类。我理想地想解决这个问题,或者找到合适的替代方案。我尝试过STLPort和SGI的标准模板库,结果相同。我只能假设,因为它们是由非常旧的 gcc 链接的,所以它们无法解决问题。

有人有任何可能的建议或解决方案吗?或者也许您可以建议我可以将矢量(和字符串)的实现放入我的代码中?

预先感谢您的任何指导。

#include <stdio.h>
  #include <vector>
  #include <list>
  #include <string>

  using namespace std;
    /////////////////////////////////////////////////////////////////////////////

    class TestSeg
    {
     static pthread_mutex_t     _logLock;
     public:
      TestSeg()
      {
      }

      ~TestSeg()
      {
      }

      static void* TestThread( void *arg )
      {
       int i = 0;
       while ( i++ < 10000 )
       {
        printf( "%d\n", i );
        WriteBad( "Function" );
       }
       pthread_exit( NULL );
      }

      static void WriteBad( const char* sFunction )
      {
       //pthread_mutex_lock( &_logLock );
       //{

       printf( "%s\n", sFunction );
       string sKiller;     //       <----------------------------------Bad
       //list<char> killer;    //       <----------------------------------Bad
       //vector<char> killer;    //       <----------------------------------Bad

       //}
       //pthread_mutex_unlock( &_logLock );

       return;
      }

      void RunTest()
      {
       int threads = 100;
       pthread_t     _rx_thread[threads];
       for ( int i = 0 ; i < threads ; i++ )
       {
        pthread_create( &_rx_thread[i], NULL, TestThread, NULL );
       }

       for ( int i = 0 ; i < threads ; i++ )
       {
        pthread_join( _rx_thread[i], NULL );
       }
      }

    };

    pthread_mutex_t       TestSeg::_logLock = PTHREAD_MUTEX_INITIALIZER;

    int main( int argc, char *argv[] )
    {
     TestSeg seg;
     seg.RunTest();
     pthread_exit( NULL );
    }

问题不在于容器,而在于您的代码。

完全没有必要使容器本身线程安全,因为您首先需要的是类似事务的语义。

为了演示起见,我们假设您有一个线程安全的实现vector, 例如。

  • 主题 1:if (!vec.empty())
  • 话题2:vec.clear();
  • 主题 1:foo = vec.front();

这会导致未定义的行为。

问题在于,让容器上的每个操作都是线程安全的几乎毫无意义,因为您仍然需要能够连续锁定容器本身以进行多个操作。因此,您会锁定各种操作,然后再次锁定每个操作?

正如我所说:完全没有必要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程安全的向量和字符串容器? 的相关文章

  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • 在实体框架中附加集合

    使用实体框架 我可以使用附加单个对象 entity Attach 但是 我没有看到任何方法允许我将多个对象的集合 数组添加到实体 我必须循环遍历集合中的每个项目并调用entity Attach 每一次 是的 您必须循环遍历子集合并Attac
  • 如何在 CUDA 中执行多个矩阵乘法?

    我有一个方阵数组int M 10 以便M i 定位第一个元素i th 矩阵 我想将所有矩阵相乘M i 通过另一个矩阵N 这样我就收到了方阵数组int P 10 作为输出 我看到有不同的可能性 分配不同元素的计算M i 到不同的线程 例如 我
  • 正则表达式,获取两个关键字之间的整个字符串

    我正在做一些输出解析 我需要从两个单词之间抓取一大块文本 例如 如果我正在解析文本 Hi this is an example 我希望能够指定我的两个单词是 Hi 和 example 然后我将取回字符串 this is an 我知道正则表达
  • find 命令的“exec”功能可以在后台启动程序吗?

    我想做这样的事情 find iname Advanced Linux Program exec kpdf 可能的 还有其他类似的方法吗 首先 它不会像你输入的那样工作 因为 shell 会将其解释为 find iname Advanced
  • 无法打开作为链接添加的 configSource 文件

    在我的 MVC 应用程序中 我使用外部配置文件来保持干净的 web config 有些文件很常见 我将它们作为链接从一个位置添加到项目中 对于这些文件 我将 复制 选项设置为 始终复制 这些文件将被复制到目标文件夹 我会看到它们 但是当我尝
  • 使用 mkl_malloc 进行内存对齐

    这个问题可能只是表明我还没有理解 C 中的一些重要内容 Intel Math Kernel 库提供了一种在分配内存时设置内存对齐的方法 另一方面 我只是通过引用将数组传递给 mkl lapack 例程 那么 lapack 例程如何知道数组的
  • 线程忙等待

    基本上 我需要忙着等待一些 html 出现在网页上 我创建了以下代码来忙等我 public void ExecuteBusyWaitThreads foreach Canidate canidate in allCanidates Thre
  • 如何使用 C# 从数据库中检索多个图像

    我有一个包含9张图像的数据库 这些图像不断变化 所以我无法直接设置src在 HTML 中 img 标签来显示 9 个图像 我必须从数据库中选择它们并相应地绑定它们 我可以使用以下命令检索并打印 1 张图像Response BinaryWri
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru
  • const QList 警告 = QList() << 0; gcc 4.7.2 的段错误

    因此 主题行中提到的代码会导致 Qt 4 8 3 和 gcc 4 7 2 出现分段错误 这是在 cpp 文件中的任何类 结构之外 并且与 gcc 4 4 一起使用 const QList
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • 树视图上的 VirtualizingStackPanel 不是虚拟化

    我在这里遇到一个问题 我想在 TreeView 中显示一些项目 大约 100 000 个元素 如果我使用默认的 WPF TreeView 一切似乎都可以工作 但如果我使用自定义 TreeView 目前只有 ItemsControl 虚拟化似
  • INotifyPropertyChanged 与线程

    我有一个 BindingList
  • C++ 抛硬币程序错误

    我正在尝试计算抛硬币中连续的正面朝上的次数 不幸的是 我的连续头计数器没有正确增加 有任何想法吗 代码和示例输出如下 include
  • BigInteger 乘以 Double

    我的物理老师给全班布置了一项艰巨的任务 我正在尝试创建一个程序来为我计算一些事情 在某个时刻 我需要将分子数量乘以百分比 Ulong 不能容纳大到 6022 10 19 的数字 所以我必须使用 net 4 0 中的 BigInteger 但
  • 使用 ViewBag 时出现 RuntimeBinderException

    我们收到 Layout cshtml 中使用的 Viewbag 项目的 RuntimeBinderException 我们在内存分析器中观察到这些异常 它们不是致命的 一切正常 但很烦人 我们想清除它们 例如 以下代码会导致异常 Rende
  • Excel 中的单元格“数字存储为文本”

    我有一个 C 程序 它获取旧报告的文本文件并映射到 Excel 工作表 但对于交易单元格 它输出为 数字存储为文本 这不允许 任何格式 我们想要显示 1 000 00 但它仅显示为 1000 有什么办法可以得到这种格式吗 这些列是余额和金额
  • Linux命令:如何仅“查找”文本文件?

    经过几次谷歌搜索后 我得出的结论是 find my folder type f exec grep l needle text exec file grep text 这非常不方便 并且会输出不需要的文本 例如 mime 类型信息 还有更好
  • EF,Code First - 如何在插入时设置自定义 Guid 标识值

    在处理在数据库中插入新实体时 我面临以下问题Guid作为主键 代码优先的 EF 5方法 我知道有很多类似的主题 因为我为此问题运行了几个小时 但我找不到与此问题相关的主题 举个例子 我的 POCO 类是 public class Entit

随机推荐

  • Josh Smith 的 MVVM 示例中的视图是如何构建的?

    作为 WPF 和 MVVM 的新手 我正在学习Josh Smith 关于 MVVM 模式的文章 http msdn microsoft com en us magazine dd419663 aspx以及随附的示例代码 我可以看到该应用程序
  • AWS-Lambda 可以使用调用 C 的 Python 吗?

    我有一个进行图像比较的 C 库和调用它的 Python 我在 AWS Lambda 功能列表中没有看到 C 或 C 运行时 然而 Python 本身不是调用 C 的吗 我以为翻译其实是C 我们可以在 AWS Lambda 上运行从 Pyth
  • RESTful WCF Web 服务 POST 问题

    我无法将参数传递给 wcf web 服务 我的网络方法 OperationContract WebInvoke Method POST ResponseFormat WebMessageFormat Json UriTemplate pla
  • 有关 SQL Server 中重音不敏感的问题 (Latin1_General_CI_AS)

    我们所有的数据库都是使用默认排序规则安装的 Latin1 General CI AS 我们计划更改排序规则 以允许客户端不区分重音地搜索数据库 问题 不区分重音的数据库有哪些负面影响 如果有的话 不区分重音的数据库是否有任何性能开销 为什么
  • 复选框不显示 Chrome - 在其他浏览器中工作

    我不确定发生了什么事 记住我 左侧应该有一个复选框 底部应该有两个测试复选框 因为我有一辆自行车 我有一辆汽车 它们在 Firefox 中显示 但在 Chrome 中不显示 我相信我有 CSS 问题 但找不到它 有人可以帮忙吗 http w
  • Python ord 函数中的多个字符

    编程初学者在这里 Python 2 7 是否有解决方法可以在 Python 的 ord 函数中使用多个字符 例如 我有一个十六进制字符串 xff x1a 我想要它的十进制值 以便我可以将其与其他十六进制字符串求和 但是 ord 只接受单个十
  • 在C中从键盘获取输入而不用“return”

    在 C Mac OS 中 如何在不按 return 的情况下从键盘获取输入 在带有终端的类 Unix 系统上 我认为 MacOS X 符合要求 那么您需要将终端设置为所谓的 cbreak 模式 重点是terminal保留数据直到按下 ret
  • 尽管导入了类,但未定义类

    我似乎遇到了一个非常令人困惑的错误 尽管导入了包含我的类的 py 文件 Python 仍然坚持认为该类实际上并不存在 testmodule py中的类定义 class Greeter def init self arg1 None self
  • 在我的 android studio 模拟器中元素相互重叠

    我是新来的Android Studio 当我创建应用程序时 所有元素都相互重叠 我不知道如何编辑这段代码 请给我详细的描述 布局编辑器和模拟器结果 布局代码
  • Spark 执行器上的对象缓存

    对于 Spark 专家来说 这是一个很好的问题 我正在处理数据map操作 RDD 在映射器函数中 我需要查找类的对象A用于处理 RDD 中的元素 由于这将在执行器上执行并创建类型的元素A 将被查找 恰好是一个昂贵的操作 我想在每个执行器上预
  • PHP:如何检查 URL 是 Youtube 还是 vimeo

    如何编写一个函数来检查提供的 URL 是 youtube 还是 vimeo 例如 我将这两个 URL 作为字符串存储在数据库中 http vimeo com 24456787 http www youtube com watch v rj1
  • 使用 groupby 和 Mean() 在 Pandas 中保留一个包含分类变量的列

    有没有办法在之后保留分类变量groupby and mean 例如 给定数据框df ratio Metadata A Metadata B treatment 0 54265 937500 B10 1 AB cmpd 01 11 10736
  • 如何在内容可编辑 iframe 内创建非内容可编辑 div?

    我需要将内容可编辑的 iframe 内的某些部分设置为不可编辑 我怎么做 下面的代码在 Chrome 中有效 但在 Firefox 中无效 一切都可以在 Firefox 中编辑 我需要复选框不可编辑 Editable text div di
  • Azure 中虚拟机和应用服务之间的 Vnet

    我不知道如何连接网络应用程序 应用服务 to a 虚拟机在蔚蓝中 我已从 Web 应用程序配置面板创建了 VNet 所有项目都是使用创建的资源管理型号 都在同一个订阅并且至少是Standard定价层 显然 Web 应用程序无法连接到 V2
  • 警告会话 0x0 服务器为空、意外错误、关闭套接字连接并尝试重新连接

    我有两个节点 每个节点上都安装了带有Mesos marathon和zookeeper的docker 这是我在主节点上的 docker compose 文件 version 3 7 services zookeeper image ubunt
  • SQL Server 锁解释

    下面是 SQL Server 2000 支持的锁列表 我对 意图 锁的实际含义有点困惑 我在网上查了一下 答案似乎有点神秘 为了进一步获得我的具体问题的答案 我希望将此问题用作 Wiki 了解每个锁的含义以及在什么情况下将获取该类型的锁 S
  • pandas.groupby 对象上尊重时间的移动平均值

    给定一个以下格式的 pandas 数据框 toy pd DataFrame id 1 2 3 1 2 3 1 2 3 date 2015 05 13 2015 05 13 2015 05 13 2016 02 12 2016 02 12 2
  • 在 JavaFX 上的按钮中加载 SVG 文件

    我在 Inkscape 中创建了一个 SVG 图像 我把它放在与我的班级相同的目录中 有没有办法加载该图像并将其转换为 SVG 路径 这背后的想法是获得该图像getClass getResource image svg toExternal
  • 如何在 Jetpack Compose 中创建垂直无限轮播?

    我正在尝试构建一个可滚动列 最好是 LazyColumn 它将在滚动到末尾后再次开始重新显示第一个项目 例如 看看这个闹钟 它将从 00 59 开始循环 然后再次从 0 开始平滑滚动 我尝试过一个普通的 LazyColumn 它会显示 58
  • 线程安全的向量和字符串容器?

    我之前发过一个问题 在嵌入式 Linux 平台上使用 std string 时出现段错误 https stackoverflow com questions 2412667 seg fault when using stdstring on