2014-02-12 7 views
0

Возможно ли, что код ниже для создания неопределенного поведения?std :: thread undefined поведение

unsigned int total_threads = 10; 
vector<thread> t(total_threads); 
unsigned int *nums = (unsigned int*)calloc(total_threads, sizeof(int)); 

for(unsigned int i = 0; i < 1000; i++) 
{ 
    for(unsigned int j = 0; j < total_threads; j++) 
     t[j] = thread(func_, std::ref(nums[j])); 

    for(unsigned int j = 0; j < total_threads; j++) 
     t[j].join(); 

    for(unsigned int j = 0; j < total_threads; j++) 
    { 
     cout << nums[j] << " "; 
     nums[j] = 0; 
    } 
} 
+2

Это скорее зависит от того, что делает 'func_'. Пока это только изменяет значение, на которое дается ссылка, я уверен, что все это хорошо определено. –

ответ

4

Да, поскольку calloc может потерпеть неудачу. Проверьте возвращаемое значение или используйте std :: vector.

+0

Почему calloc терпит неудачу? Я имею в виду, если останется свободная память, может ли она потерпеть неудачу? – Luka

+0

@ Luka Если память не может быть выделена, это один из примеров. Ваша система может решить не давать вам память по какой-либо причине, которую она выбирает, поэтому вы должны обрабатывать все возможные случаи возвращаемого значения. http://en.cppreference.com/w/cpp/memory/c/calloc –

+0

Хорошая точка, но если каждая вещь может потерпеть неудачу, то как сообщить об ошибке, если я не могу писать в файлы? Что делать, если запись в файл не удалась? – Luka

Смежные вопросы