- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我全神贯注于此,但找不到错误。任何人都可以帮助我在哪里我做不好的编程。
一boost::thread
收到strings
通过套接字,将它们拆分为 vector<string>
并将它们排序到 shared class
中的正确变量中.其他线程从那里读取。我试图通过互斥使它成为线程安全的,如图所示 here .
感谢任何帮助,即使是小提示:)
这是程序终止的方式:
Looping...<enter to exit>
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
这是对应的文件。纠缠ROS ,但这部分不应该是判决。
class shared
{
public:
shared() : count(0) {/*emp. body*/ } //constructor
void setvec(vector<string> &strVec, int type){
boost::upgrade_lock<boost::shared_mutex> lock(mtx);
boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);
switch(type) {
case 1: typ1acc = strVec; setsensor[0] = true; break;
case 2: typ2mag = strVec; setsensor[1] = true; break;
case 3: typ3 = strVec; setsensor[2] = true; break;
}/**/
}
vector<string> getvec(int type) {
boost::shared_lock<boost::shared_mutex> lock(mtx);
switch(type) {
case 1: tmp = typ1acc; break;
case 2: tmp = typ2mag; break;
case 3: tmp = typ3; break;
}
return tmp;
}
private:
boost::shared_mutex mtx;
vector<string> tmp;
vector<string> typ1acc;
vector<string> typ2mag;
vector<string> typ3;
};
shared c; //class object
类从多个 boost::threads 调用:
//socket function which sorts vectors into shared class
//this happens from one boost::thread
int type; //key sort by sensor type
vector<string> strVec;
c.setvec(strVec,type);
//multiple boost::threads call this to read the vectors
//this happens from multiple boost::thread
strVec = c.getvec(type);
最佳答案
我认为在函数外部设置 tmp
的问题在于,互斥析构函数将(或可以)在从 tmp
到永久变量的复制操作之前运行,从而导致一个小窗口,可以在其中覆盖 tmp
并导致潜在的数据竞争。
如果您创建简单的假互斥锁/字符串类来显示它们何时运行,您就可以看到这一点。最后的代码为我输出了以下内容(VC++ 2015):
CSimpleString Raw Constructor (g_tmp)
CSimpleString Raw Constructor (result)
CFakeMutex Constructor
CSimpleString Copy Raw Operator (TestFunction)
CSimpleString Copy Constructor (TestFunction)
CFakeMutex Destructor
CSimpleString Copy Operator (TestFunction)
CSimpleString Destructor (TestFunction)
Result = TestFunction
重要的行缩进显示你的互斥锁在重要的复制发生之前被销毁/释放。如果将 tmp
放入函数中,操作顺序似乎不会改变,但由于 tmp
是局部变量,因此不会发生潜在的数据竞争。
下面是用于测试的非常基本的代码。
#include <string.h>
#include <vector>
class CFakeMutex
{
public:
CFakeMutex()
{
printf("CFakeMutex Constructor\n");
}
~CFakeMutex()
{
printf("CFakeMutex Destructor\n");
}
};
class CSimpleString
{
public:
CSimpleString() {
printf("CSimpleString Empty Constructor\n");
}
CSimpleString(const char* pString) : m_String(pString) {
printf("CSimpleString Raw Constructor (%s)\n", pString);
}
CSimpleString(const CSimpleString& String) : m_String(String.m_String) {
printf("CSimpleString Copy Constructor (%s)\n", String.m_String.c_str());
}
~CSimpleString()
{
printf("CSimpleString Destructor (%s)\n", m_String.c_str());
}
CSimpleString& operator=(const CSimpleString& Src)
{
if (&Src == this) return *this;
printf("CSimpleString Copy Operator (%s)\n", Src.m_String.c_str());
m_String = Src.m_String;
return *this;
}
CSimpleString& operator=(const char* pString)
{
printf("CSimpleString Copy Raw Operator (%s)\n", pString);
m_String = pString;
return *this;
}
std::string m_String;
};
CSimpleString g_tmp("g_tmp");
CSimpleString TestFunction()
{
CFakeMutex Mutex;
CSimpleString local_tmp("local_tmp");
//local_tmp = "TestFunction";
//return local_tmp;
g_tmp = "TestFunction";
return g_tmp;
}
int main()
{
CSimpleString result("result");
result = TestFunction();
printf("Result = %s\n", result.m_String.c_str());
return 0;
}
关于c++ - 程序在一段时间后终止 "std::bad_alloc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391894/
如果我终止应用程序,我在尝试保持我的功能运行时卡住了。 是否可以在应用程序未运行时保持核心位置(地理围栏/地理定位)和核心蓝牙运行?如果可能如何解决我的问题?我已经检查了背景模式,并实现了核心定位方法
该程序要求用户输入一个数字,然后从列表中返回详细信息。我该怎么做? do { Scanner in = new Scanner(System.in);
我正在开发一个内部分发的 iOS 应用程序(即,没有应用程序商店),我希望能够以恒定的 10 分钟间隔报告设备的位置。 无论如何,我在我的 plist 中包含了 location 作为字段 UIBac
我的 mongodb 服务器突然收到信号 15(终止)。我不知道为什么 mongodb 崩溃了。以下是日志消息。 Mon Jun 27 07:33:31.701 [signalProcessingTh
我按顺序运行了一堆malloc,并且每次都检查以确保它是成功的。像这样: typedef struct { int *aray; char *string; } mystruct; m
这个问题已经有答案了: How to stop a running pthread thread? (4 个回答) 已关闭 8 年前。 可以使用 pthread_join() 停止线程。但让我们想象一
#include #include #include struct node{ char data; int p; struct node *ptr; }; struct node *st
这个问题已经有答案了: Why should I use a semicolon after every function in javascript? (9 个回答) 已关闭 8 年前。 好吧,我问
我有一个启动多个工作线程的函数。每个工作线程都由一个对象封装,该对象的析构函数将尝试加入线程,即调用if (thrd_.joinable()) thrd_.join();。但是,每个 worker 必
我正在实现一个应用程序,当用户摇动手机时,该应用程序会监听并采取行动。 所以我实现了以下服务: public class ShakeMonitorService extends Service {
我在使用 Xcode 时遇到问题,其中弹出错误“Source Kit Service Terminated”,并且所有语法突出显示和代码完成在 Swift 中都消失了。我怎样才能解决这个问题? 这是一
我想为我的控制台应用程序安全退出,该应用程序将使用单声道在 linux 上运行,但我找不到解决方案来检测信号是否发送到它或用户是否按下了 ctrl+c。 在 Windows 上有内核函数 SetCon
关键: pthread_cancel函数发送终止信号pthread_setcancelstate函数设置终止方式pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程取消
下面的程序在不同的选项级别下有不同的行为。当我用 -O3 编译它时,它永远不会终止。当我用 -O0 编译它时,它总是很快就会终止。 #include #include void *f(void *
我有 3 个节点的 K8S 集群,我创建了 3 个副本 pod,应用程序 app1 在所有 pod 上运行,我通过运行 service yaml 文件建立了服务,我可以看到通过运行 kubectl g
我打算使用 nginx 来代理 websocket。在执行 nginx reload/HUP 时,我知道 nginx 等待旧的工作进程停止处理所有请求。然而,在 websocket 连接中,这可能不会
在 Ubuntu 9.10 上使用 PVM 3.4.5-12(使用 apt-get 时的 PVM 包) 添加主机后程序终止。 laptop> pvm pvm> add bowtie-slave add
我编写了一个应用程序来从 iPhone 录制视频。它工作正常,但有一个大问题。当 AVCaptureSession 开始运行并且用户尝试从其库(iPod)播放音频时。此操作将使 AVCaptureSe
我将如何使用NSRunningApplication?我有与启动应用程序相反的东西: [[NSWorkspace sharedWorkspace] launchApplication:appName]
我正在使用 NSTask 执行一系列长时间运行的命令,如下所示: commandToRun = @"command 1;command2"; NSArray *arguments = [NSArray
我是一名优秀的程序员,十分优秀!