【发布时间】:2015-04-03 14:19:15
【问题描述】:
我想用 5 个线程打印内容为 1,2,3,4,5 的字符串,我的工作环境:
操作系统版本:CentOS Linux release 7.0.1406 (Core)
g++ 版本:g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16)
编译cmd:g++ -o thread_sz -std=c++11 -pthread thread_sz.cpp
// file name: thread_sz.cpp
#include <iostream>
#include <string>
#include <thread>
#include <unistd.h>
using namespace std;
void myFunc1(char* sz)
{
printf("sz = %s\n", sz);
}
void myFunc2(const char* const sz)
{
printf("const char* const sz = %s\n", sz);
}
void myFunc3(string str)
{
printf("string str = %s\n", str.c_str());
}
int main(int argc, char* argv[])
{
for(int i = 1; i <= 5; i++) {
char sz[16];
sprintf(sz, "%2d", i);
const string str(sz);
std::thread t1(myFunc1, sz);
std::thread t2(myFunc2, (const char* const)str.c_str());
std::thread t3(myFunc3, str);
t1.detach();
t2.detach();
t3.detach();
}
usleep(1000000); // sleep 1 second
return 0;
}
输出类似:
const char* const sz = 1
sz = 3
const char* const sz = 2
string str = 3
sz = 4
sz = 4
string str = 2
sz = 5
const char* const sz = 4
sz = 5
string str = 1
const char* const sz = 5
string str = 4
string str = 5
const char* const sz = 5
我多次运行程序,结果似乎:
string str output: 100% correct
sz output: ~10% correct
const char* const sz output: ~50% correct
我的问题是:
1,为什么 MyFunc1 和 MyFunc2 不是 100% 正确,它们有什么区别。如何解决。
2,MyFunc3 能否 100% 正确工作。
3,如果我注释掉这一行
usleep(1000000); // sleep 1 second
MyFunc1 可能会输出空值,例如
sz =,为什么?
非常感谢。
【问题讨论】:
-
您在线程有时间读取它之前覆盖了 sz。
-
sz和str都是在循环的下一次迭代之前退出范围的自动变量。从t1和t2访问 either 会在它们被销毁后调用未定义的行为。因此,您的程序格式错误。t3有效,因为您正在向线程发送str的副本。 -
@Baldrick,如果 MyFunc1 是来自第 3 方的 API,如何解决。
-
仅供参考
std::this_thead::sleep_for(std::chrono::seconds(1)); -
所以编写一个调用他们的 API 但拥有资源的包装器,并将该包装器用作线程过程。一旦他们的 API 完成,您的包装器可以在完成线程之前进行清理。谁说你必须将他们的 API 函数直接传递给
std::thread?你可以传递一个 you 编写的包装器,并从 that 调用他们的包装器。但如果可能的话,我强烈建议加入。
标签: c++ multithreading pointers c++11