2017-10-07 69 views
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(); 
} 
+0

我想'srand'和'rand'不是線程安全的。嘗試使用'random'標頭中的工具 – Justin

+0

否,'new'和'delete'本身不是線程安全的。 – user0042

+3

@ user0042全局新建和刪除需要按照以下方式進行線程安全:http://en.cppreference.com/w/cpp/memory/new/operator_new#Notes – Justin

回答

3

rand()線程之間的共享狀態;這已經解釋了你的觀察。