0
我想了解,如果在C + + 11新/刪除線程安全。 我發現有衝突的答案。 我正在運行這個簡短的程序,有時我從兩個線程得到不同的結果(我希望總是得到相同的結果)。 這是由於內存分配問題嗎?我錯過了什麼? 我試着用malloc/free,相同的行爲。C++多線程:線程安全的內存分配
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();
}
我想'srand'和'rand'不是線程安全的。嘗試使用'random'標頭中的工具 – Justin
否,'new'和'delete'本身不是線程安全的。 – user0042
@ user0042全局新建和刪除需要按照以下方式進行線程安全:http://en.cppreference.com/w/cpp/memory/new/operator_new#Notes – Justin