我试图理解在C ++ 11中新建/删除是否是线程安全的。 我找到了相互矛盾的答案。 我正在运行这个简短的程序,有时我从两个线程得到不同的结果(我希望总能得到相同的结果)。 这是由于内存分配问题吗?我错过了什么? 我尝试使用malloc / free,同样的行为。
我正在编译:
g++ -o out test_thread.cpp -std=c++11 -pthread
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
感谢。
#include <string>
#include <iostream>
#include <thread>
#include <stdlib.h>
void task(int id)
{
int N = 10000;
srand(100);
int j;
long tot = 0;
int *v = new int[N];
/* int *v = 0;
v = (int *) malloc (N * sizeof(int));
*/
for (j = 0; j < N; j++)
v[j] = rand();
for (j = 0; j < N; j++)
tot += v[j];
//free(v);
delete [] v;
printf("Thread #%d: total %ld\n", id, tot);
}
int main()
{
std::thread t1(task, 1);
std::thread t2(task, 2);
t1.join();
t2.join();
}
答案 0 :(得分:3)
rand()
在线程之间共享状态;这已经说明了你的意见。