Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Вычисление контрольной суммы CRC32, Готовый класс для работы 
V
    Опции темы
volatile
Дата 19.5.2011, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(borisbn @  19.5.2011,  00:14 Найти цитируемый пост)
Чо делать ?

Ок. щаз чонить сбацем.. smile 
Начнем с того, что Ваша идея хороша!
Цитата(borisbn @  18.5.2011,  00:31 Найти цитируемый пост)
int dummy = CRC32::Init_CRC32_Table(); // один статический вызов

Есть только одно НО, как я уже писал.
Предположим, что необходимо чтобы при вызове конструктора первого экз-ра., уже массив был готов.
Цитата(volatile @  18.5.2011,  01:22 Найти цитируемый пост)
например, вы написали int dummy = ...; в одном файле.
а в другом файле объявлена глобальная переменная
TCRC32 a;
какой код будет выполнен первый? это неопределено. 50% можно нарваться на большие неприятности.

Вот чтобы этого избежать, делаем так.
Код

class initor {
public:
   initor () 
   { 
      if (!done)
      {
          CRC32::Init_CRC32_Table();
      }
      done = 1;
   }
private:
   static bool done;
};
static initor dummy;

Этот код обязательно помещаем в тот же .h файл, что и CRC32. Это принципиально.

Как это работает.
Подключая наш CRC32.h мы создаем объект initor dummy;
Создаем столько этих объектов, сколько раз мы подключили .h файлик. (В каждом модуле свой обектик initor dummy)
Сам объет небольшой (1 байт), так-что накладные расходы не велики.
Подключая его таким образом, мы гарантируем что код инициализации, будет всегда выполнен раньше любого глобального 
TCRC32 a;

Ну вобщем где-то так. Эта идея не моя.

Добавлено через 57 секунд
Да, и таблица будет проинициализирована до входа в main(), когда поток один.

PM MAIL   Вверх
volatile
Дата 19.5.2011, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Идея GremlinProg, тоже хороша, но там надо юзать мьютексы, а не interlockedexchange.
Ну это уже, имхо, не совсем чистый С++.
Цитата(borisbn @  18.5.2011,  08:31 Найти цитируемый пост)
но, как-то это не кошерно  
Согласен.

Впрочем, если еще до входа в маин есть куча потоков (а такое бывает?), то тогда мьютексы, делать нечего.

хотя мой вариант с константами, всё-равно, мне ближе по душе. Проще надо быть... smile 
PM MAIL   Вверх
GremlinProg
Дата 19.5.2011, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(volatile @  19.5.2011,  03:53 Найти цитируемый пост)
но там надо юзать мьютексы, а не interlockedexchange

задача была - избавиться от повторной инициализации таблицы,
один вызов _InterlockedExchange ее решает,

следующая задача - недопустить использования таблицы до ее инициализации,
при чем тут-то _InterlockedExchange?

естественно, здесь можно задействовать методы синхронизации доступа,
подойдет простая установка события (событие-неавтомат) сразу после цикла инициализации
и ожидание его в методе генерации, перед расчетом CRC


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
volatile
Дата 19.5.2011, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(GremlinProg @  19.5.2011,  06:34 Найти цитируемый пост)
задача была - избавиться от повторной инициализации таблицы,
один вызов _InterlockedExchange ее решает,

повторная инициализация, это всего лишь оверхед. А вот использование до инициализации, это уже пипец всей программе.

Не отрубают голову, когда хотят всего лишь избавиться от лишних волос
имхо.

PM MAIL   Вверх
GremlinProg
Дата 19.5.2011, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(volatile @  19.5.2011,  08:42 Найти цитируемый пост)
повторная инициализация, это всего лишь оверхед. А вот использование до инициализации, это уже пипец всей программе.

1. повторю вопрос: каким боком _InterlockedExchange относится к синхронизации доступа к таблице?
если ни каким, то и не надо его поминать всуе, т.к. вводит в заблуждение

2. оверхед - когда атомарно пишем чего-нить куда-нить, не меняя ни бита, а расчет не всегда может быть атомарным (он им просто не обязан быть), т.е. надеяться в таком случае на оверхед несколько несерьезно
Цитата(volatile @  19.5.2011,  08:42 Найти цитируемый пост)
Не отрубают голову, когда хотят всего лишь избавиться от лишних волосимхо.

это к _InterlockedExchange тоже не относится,
это можно отнести к генерации статической таблицы констант в MT среде,
т.е. к самому методу, как таковому,

по этому поводу по моему уже все высказались и пришли к выводу, что он в данном случае не актуален


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
xvr
Дата 19.5.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Делаете в TCRC32 функцию init_table() и зовете ее в начале GetCRC32*
Код

class TCRC32 {
 void init_table()
  {
   static int notused=Init_CRC32_Table();
  }
...

    DWORD    GetCRC32(const PCHAR szFilePath, const bool & bShouldStop = false)
    {
      init_table(); 
        HANDLE hHandle    = CreateFile(szFilePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
        // ----
 ...
    }

    DWORD    GetCRC32(const PCHAR szInBuf, DWORD dwLength, const bool & bShouldStop = false)
    {
      init_table(); 
        DWORD dwCRC32        = 0xFFFFFFFFUL; // CRC_MASK;
        // ----
...
    }
};
Все вопросы синхронизации и инициализации таблицы возьмет на себя компилятор (по крайней мере должен взять)

Но лучше конечно вбить таблицу константами  smile 

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.