Тема: ATL/MFC::CString и многопоточность

Ответить в теме
Показано с 1 по 7 из 7
  1. Вверх #1
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256

    По умолчанию ATL/MFC::CString и многопоточность

    CString использует ленивое копирование. при этом для увеличения/уменьшения счетчика ссылок используется _AtlInterlockedIncrement\_AtlInterlockedDecrement. однако для всех других операций, в частности - провека значения счетчика, никакой специальной поддержки многопоточности нет.
    В результате, даже если операции присвоения одной строки в другую делать в контескте некого объекта синхронизации (например критической секции) - дальнейшая работа с обеими строками все равно остается потоконебезопасной.
    Поэтому присвоение нужно производить, либо предварительно делая Lock для исходной строки, либо через SetString для целевой, приводя исходную к LPCTSTR.

    Для чего этот топик:
    1. "Граждане, будьте бдительны"
    2. Вожможно, кто-то объяснит мне что я не прав и расскажет как именно можно прекрасно работать с CString в многопоточном приложении.


  2. Вверх #2
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    19,028
    Репутация
    1489
    Directly from MSDN:
    For size and performance reasons, MFC objects are not thread-safe.

    все правильно, хочешь работать с тредами, заверни CString во враппер.
    индивидуальная субстанция разумной природы

  3. Вверх #3
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    19,028
    Репутация
    1489
    под рукой кода CString нет. но непонятно, зачем тогда было счетчики делать thred-safe?
    индивидуальная субстанция разумной природы

  4. Вверх #4
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256
    Цитата Сообщение от Ull9 Посмотреть сообщение
    Directly from MSDN:
    For size and performance reasons, MFC objects are not thread-safe.

    все правильно, хочешь работать с тредами, заверни CString во враппер.
    ну, CString - это типо общий класс и для MFC и для ATL. имхо, в приложениях второго типа многопоточность используют почаще - и тут такая подляна.

    обернуть враппером - та это и лениво и вроде не за чем. главное проблему осознать - а потом уже можно бороться и без враппера - правильным присвоением, чтобы CStringData не шарилась.


    Цитата Сообщение от Ull9 Посмотреть сообщение
    под рукой кода CString нет. но непонятно, зачем тогда было счетчики делать thred-safe?
    а хз. типа мы пытались и не допытались.

    вообще ATL часто используют для COM, а там удобнее - и часто юзают - CComBSTR. еще по С++ привычке часто юзают std::string. оба этих класса не имеют ленивого копирования и такой подлянкой не страдают.
    кроме того они приучают не сбивать руку и пользовать почаще
    const TYPE&

  5. Вверх #5
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    19,028
    Репутация
    1489
    ленивое копирование это что? мож по английски скажи, забыл я русский.
    индивидуальная субстанция разумной природы

  6. Вверх #6
    Постоялец форума Аватар для Guffy
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    49
    Сообщений
    1,356
    Репутация
    256
    lazy-copy
    когда один экземпляр CString присваивается другому - непосредсвенно второй копии массива символов не делается, увеличивается счетчик в соотв. структуре.
    когда же в одной из этих двух строк вызывается один из методов, который приводит к изменению строки - вот тогда происходит fork - реальное выделение памяти под отдельную копию и копирование символов.

  7. Вверх #7
    Не покидает форум Аватар для Ull9
    Пол
    Мужской
    Адрес
    Мюнхен
    Сообщений
    19,028
    Репутация
    1489
    Ah so, this is COW.

    ok
    индивидуальная субстанция разумной природы


Ответить в теме

Похожие темы

  1. MFC Brother 5490CN помогите разобраться
    от Fila23 в разделе Программное обеспечение
    Ответов: 5
    Последнее сообщение: 16.04.2011, 13:27
  2. Размер буфера под сокеты в виндах, MFC
    от lexar в разделе Программирование
    Ответов: 3
    Последнее сообщение: 20.06.2007, 18:51
  3. ATL
    от GGGGG-UniT в разделе Кино и видео
    Ответов: 0
    Последнее сообщение: 02.06.2007, 21:58
  4. C/C++/MFC... и многое другое
    от FINT в разделе Программирование
    Ответов: 7
    Последнее сообщение: 26.03.2006, 15:34
  5. C/C++/MFC... и многое другое
    от Nfk в разделе Программное обеспечение
    Ответов: 3
    Последнее сообщение: 04.01.1970, 19:10

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения