字符串流和多线程
stringstream and multithreading
我是多线程和C++的新手,在尝试在我的应用程序中使用保存文件的线程时遇到问题。代码如下:
#include <iostream>
#include <thread>
#include <fstream>
#include <vector>
#include <sstream>
using namespace std;
void writeCSV(vector<vector<double> > & vec, const char* filename) {
ofstream output(filename);
for (vector<vector<double> >::const_iterator i = vec.begin(); i != vec.end(); ++i) {
for (vector<double>::const_iterator j = i->begin(); j != --i->end(); ++j) {
output << *j << ", ";
}
output << *(--i->end()) << "n";
}
}
void testFn(int id) {
std::ostringstream filename;
vector<vector<double> > v(460, vector<double>(460,0));
filename << "test" << id << ".csv";
const char* fileStr = filename.str().c_str();
cout << id << " : " << fileStr << endl;
writeCSV(v, fileStr);
}
int main() {
int numOfThreads = 180;
std::thread t[numOfThreads];
for (int i= 0; i< numOfThreads; i++) {
t[i] = std::thread (testFn, i);
}
for (int i = 0; i< numOfThreads; i++) {
t[i].join();
}
return 0;
}
当我运行这个程序时,它会在终端中打印出来(结果的子部分):
66 : 0�c
97 : test97.csv
90 : �'�dz
85 : �'�dz
43 :
9695 : �'�dz
67 : �'�dz
93 :
: �_ ��
115 : test115.csv
144 : test144.csv
99 : test99.c0
68 :
91 : )�
98 : test98.c0
以及保存具有奇怪/错误文件名的文件。我猜这似乎是多线程和 ostringstream 的问题,但有什么想法为什么/如何解决吗?
这与多线程无关。
const char* fileStr = filename.str().c_str();
std::ostringstream
的 str()
方法返回一个表示字符串流内容的std::string
。
std::string
的 c_str()
方法返回一个指向字符串数据的内部指针。
您缺少的是,c_str()
返回的指针仅在std::string
被修改或销毁(以先到者为准)之前有效。
在这里,std::string
立即被销毁,因为它是一个临时值。因此,指向其内部数据的指针将立即失效。
必须将返回的字符串存储在对象中,只要需要字符串数据,该对象就存在。只是:
std::string str = filename.str();
const char* fileStr = str.c_str();
str
在其自动范围的其余部分继续存在,在这里已经足够长了。
在文件启动代码中,有以下摘录:
std::ostringstream filename;
...
filename << "test" << id << ".csv";
const char* fileStr = filename.str().c_str();
最后一句台词是杀手锏。你正在做的是获取你辛苦赚来的filename
,从中获取string
表示,从中提取c_str()
指针 - 然后销毁临时string
对象。从那时起,任何访问fileStr
的尝试都是令人担忧的。
您需要做的是将临时string
对象分配给局部变量:
filename << "test" << id << ".csv";
std::string fileString = filename.str();
const char* fileStr = fileString.c_str();
这保证了临时string
对象的生存期 - 至少在函数结束之前!
如果不这样做,fileStr
指向未分配堆的中间 - 堆在其下方更改。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 在多线程中编辑字符串
- 多线程环境中的输出字符串流出现问题
- 从 C++ => C 包装的 API(多线程)传输错误字符串
- 关于多线程应用程序中的 STL 字符串异常
- 控制对多线程程序中字符串对象的访问的最佳方法
- 字符串流和多线程