Бросок стиля C++ от неподписанного символа * к символу константы *

Слушайте, нет простого способа сделать это. Я работаю над проектом, который по своей сути многопоточен. События происходят из операционной системы, и я должен обрабатывать их одновременно.

Самый простой способ справиться с тестовым сложным многокритериальным кодом приложения таков: если он слишком сложный для тестирования, вы делаете это неправильно. Если у вас есть один экземпляр, на котором действует несколько потоков, и вы не можете тестировать ситуации, когда эти потоки пересекаются друг с другом, тогда ваш дизайн нужно переделать. Это как просто, так и сложно.

Существует много способов программирования для многопоточности, которая позволяет избежать потоков, проходящих через экземпляры одновременно. Самое простое - сделать все ваши объекты неизменными. Конечно, это обычно невозможно. Таким образом, вам нужно определить те места в вашем дизайне, где потоки соединяются с одним и тем же экземпляром и уменьшают количество этих мест. Делая это, вы выделяете несколько классов, где на самом деле происходит многопоточность, что снижает общую сложность тестирования вашей системы.

Но вы должны понимать, что даже делая это, вы все равно не можете проверять каждую ситуацию, когда два потока наступают друг на друга. Для этого вам нужно будет одновременно запускать два потока в одном тесте, а затем точно контролировать, какие строки они выполняют в любой момент. Лучшее, что вы можете сделать, это симулировать эту ситуацию. Но это может потребовать от вас специального кода для тестирования, и это в лучшем случае на полшага к истинному решению.

Вероятно, лучший способ проверить код для проблем с потоками - это статический анализ кода. Если ваш потоковый код не соответствует конечному набору шаблонов с потоком, у вас может возникнуть проблема. Я считаю, что анализ кода в VS содержит некоторые сведения о потоковом, но, вероятно, не так много.

Послушайте, поскольку в настоящее время (и, вероятно, будет стоять на хорошем времени), лучший способ протестировать многопоточные приложения - это как можно больше уменьшить сложность потокового кода. Минимизируйте области, в которых взаимодействуют потоки, проверьте как можно лучше и используйте анализ кода для определения областей опасности.

76
задан Joel Coehoorn 18 March 2009 в 16:06
поделиться

5 ответов

reinterpret_cast

45
ответ дан Ruben Bartelink 7 November 2019 в 06:49
поделиться

unsigned char* - это, по сути, массив байтов и должен использоваться для представления необработанных данных, а не строки в целом. Строка в юникоде будет представлена как wchar_t*

Согласно стандарту C++ переинтерпретация_каста между unsigned char* и char* безопасна, поскольку они имеют одинаковый размер и одинаковое построение и ограничения. Я стараюсь избегать reintrepret_cast даже больше, чем const_cast в целом.

Если статическое приведение не работает с тем, что вы делаете, возможно, вам стоит пересмотреть свой дизайн, потому что, честно говоря, если вы используете C++, вам стоит воспользоваться тем, что предлагает часть "плюс плюс", и использовать строковые классы и STL (aka std::basic_string может работать лучше для вас)

.
17
ответ дан 6 November 2019 в 20:49
поделиться

char * и const unsigned char * считаются несвязанными типами. Таким образом, Вы хотите использовать reinterpret_cast.

, Но если бы Вы шли от const unsigned char* до не const тип, необходимо было бы использовать const_cast сначала. reinterpret_cast не может выбросить const или volatile квалификация.

56
ответ дан Ruben Bartelink 7 November 2019 в 06:49
поделиться

Необходимо было бы использовать reinterpret_cast<> в качестве двух типов, между которыми Вы бросаете, не связаны друг с другом.

6
ответ дан Timo Geusch 7 November 2019 в 06:49
поделиться

Попробуйте reinterpret_cast

unsigned char *foo();
std::string str;
str.append(reinterpret_cast<const char*>(foo()));
51
ответ дан Ruben Bartelink 7 November 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: