У меня есть этот кусок кода в моем приложении. Я подозреваю, что это не потокобезопасно, поэтому решите спросить SO.
int * volatile int_ptr;
int count;
Тема 1:
void grow(int new_count)
{
if(new_count <= count) return;
int * new_ptr = new int[new_count];
memset(new_ptr, 0 , new_count * sizeof(int));
memcpy(new_ptr,int_ptr,count);
int * dum_ptr = (int *)InterlockedExchange((volatile long *)&int_ptr,(long)new_ptr)
count = new_count;
delete [] dum_ptr;
}
Тема 2:
int get_value(int index)
{
return int_ptr[index];
}
Я знаю, что можно использовать CRITICAL_SECTION, но поток 1 будет работать, возможно, один раз в неделю, тогда как поток 2 будет работать миллионы раз в день. В 99,9999% попыток доступа к int_ptr
2-й поток будет входить и выходить из критической секции даром. Это просто не имеет смысла для меня. Приложение будет работать только в Windows 2000 и более поздних версиях с процессорами Intel, очевидно, с многоядерными процессорами.
Этот код потокобезопасен? Если нет, что я должен сделать, чтобы сделать его потокобезопасным? Как я могу читать int_ptr атомарно? я. е. :
int * dummy_ptr = read_atomic<int *>(int_ptr);
return dummy_ptr[index];
Решение, включая std::vector
, делает меня счастливее и комфортнее.