powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование и инициализация
33 сообщений из 33, показаны все 2 страниц
Наследование и инициализация
    #39534158
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct A {
};

struct B : public A {
	int x;
	int y;
};

void test() {
	thread_local B b = { 0 };
	b.x += rand();
	b.y += rand();
	printf("%d %d\n", b.x, b.y);
}


Не компилируется
Код: plaintext
error C2440: 'initializing': cannot convert from 'initializer list' to 'B'

Без наследования все нормально. Можно это как-то полечить не убирая = {0}?

Такой вариант не очень подходит
Код: plaintext
1.
2.
3.
4.
5.
6.
struct B : public A {
	int x = {0};
	int y = {0};
};

B b;


Т.к. так медленнее код работает. С конструктором тоже.

PS Пытаюсь асм посмотреть, но из-за thread_local вообще непонятно куда смотреть.

PPS Можно через #define порешать, но не хотелось бы кашу в коде устраивать.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534188
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thread_local B b = {0,0};
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534190
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d7ithread_local B b = {0,0};
Не угадал :) Та же ошибка.

Я так уже пробовал.

PS в struct A только методы, если это принципиально.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534213
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534274
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum Это фича с++20
Спасибо.

Наколхозил с #define. Задача была thread_local заменить на TLS, чтобы код в DLL под XP работал.

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

Но споткнулся об описанную проблему. Почему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно. До асма не докопал.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534353
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А какой смысл делать thread_local локальную переменную?
Только глобальную или статическую вижу смысл.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534356
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima T,

А какой смысл делать thread_local локальную переменную?
Только глобальную или статическую вижу смысл.
thread_local - глобальная для потока. Смысл в многопоточности, пилю свою библиотеку акторов, thread_local задействовал, но в DLL под XP не работает.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534357
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
	thread_local B b = { 0 };


это похоже на
Код: plaintext
1.
	static B b = { 0 };


но только на уровне потока, а не всего приложения/процесса.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534406
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: plaintext
1.
	thread_local B b = { 0 };


это похоже на
Код: plaintext
1.
	static B b = { 0 };


но только на уровне потока, а не всего приложения/процесса.
Похоже только. На самом деле при доступе к такой "переменной", внутри реализации вызывается функция получения адреса заведённой структуры из списков TLS, поэтому и заметно медленнее.


20858811 - верно, нельзя локальной переменной или членом класса её объявлять .
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534424
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Похоже только. На самом деле при доступе к такой "переменной", внутри реализации вызывается функция получения адреса заведённой структуры из списков TLS, поэтому и заметно медленнее.
Я про другие тормозаТест все тот же stress_test , этот код в lite_thread.h класс lite_actor_t

Если заменить код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	struct thread_info_t {
		lite_msg_t* msg_del;		// Обрабатываемое сообщение, будет удалено после обработки
		lite_actor_t* la_next_run;	// Следующий на выполнение актор
		lite_actor_t* la_now_run;	// Текущий актор
		lite_resource_t* lr_now_used;// Текущий захваченный ресурс
	};

	static thread_info_t& ti() noexcept {
		thread_local thread_info_t ti = {0};
		return ti;
	}


на такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	struct thread_info_t {
		lite_msg_t* msg_del = {NULL};		// Обрабатываемое сообщение, будет удалено после обработки
		lite_actor_t* la_next_run = { NULL };	// Следующий на выполнение актор
		lite_actor_t* la_now_run = { NULL };	// Текущий актор
		lite_resource_t* lr_now_used = {NULL };// Текущий захваченный ресурс
	};

	static thread_info_t& ti() noexcept {
		thread_local thread_info_t ti;
		return ti;
	}


То общая скорость работы падает на 4-8% (на разных процах запускал). Причем экземпляров создается штук 10, а обращений к членам класса - миллионы. Мистика какая-то от компилятора MSVC.

Если кто захочет запустить:
Количество используемых потоков (ядер проца) задается в stress_test.cpp #define CPU_MAX
Скорость смотреть в строке "msg_send/sec"


kealon(Ruslan) 20858811 - верно, нельзя локальной переменной или членом класса её объявлять .
Не буду спорить, тут больше о том как правильно назвать.
По сути thread_local это static переменная, но не одна, а по одной для каждого потока.
ИМХО неудачное название придумали, понятнее было бы thread_static

Объявить внутри класса можно так
Код: plaintext
1.
2.
3.
4.
5.
6.
	static T& ti() {
		thread_local T t;
		return t;
	}
// использование
	ti().
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534443
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе буду спорить, тут больше о том как правильно назвать.
По сути thread_local это static переменная, но не одна, а по одной для каждого потока.
ИМХО неудачное название придумали, понятнее было бы thread_static
нет, физически она в куче располагается, а не по константному адресу
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534475
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПочему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно.в дебаге или релизе тормозит?
имхо, корень проблемы в отличии POD-структур от честных классов
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534476
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima TНе буду спорить, тут больше о том как правильно назвать.
По сути thread_local это static переменная, но не одна, а по одной для каждого потока.
ИМХО неудачное название придумали, понятнее было бы thread_static
нет, физически она в куче располагается, а не по константному адресу
В куче, но по константному адресу :)

Как понимаю память под thread_local выделяется рантаймом при старте потока, т.е. все время работы потока переменная остается в одном и том же месте, а где выделяется - непринципиально, память она вся одинаковая.

Я понял про что ты говоришь: чтобы получить адрес расположения в памяти надо сначала получить адрес, по которому лежит весь блок thread_local переменных данного потока, в отличии от static, который в сегменте данных расположен. За счет этого работа с thread_local будет медленнее чем со static. Но такое сравнение неуместно, т.к. одно другим не заменишь.

Если в эти дебри не углубляться, а просто посмотреть на описание логики работы:
https://rsdn.org/forum/info/FAQ.cpp.static При объявлении локальных переменных функции ключевое слово static означает, что переменная имеет статический класс памяти (static storage duration), т.е. существует в течение всего времени выполнения программы, в отличие от переменных с локальным классом памяти (automatic storage duration).
то получается что про thread_local можно сказать тоже что про static, только с добавлением что в каждом потоке используется своя копия переменной. Я про это писал.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534478
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychDima TПочему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно.в дебаге или релизе тормозит?
имхо, корень проблемы в отличии POD-структур от честных классов
В релизе.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534494
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534497
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct A {
};

struct B : public A {
	int x;
	int y;
};

void test() {
	thread_local B b = { 0 };
	b.x += rand();
	b.y += rand();
	printf("%d %d\n", b.x, b.y);
}


Не компилируется
Код: plaintext
error C2440: 'initializing': cannot convert from 'initializer list' to 'B'

Без наследования все нормально. Можно это как-то полечить не убирая = {0}?

thread_local так же как и static уже проинициализирован нулями.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534539
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)Dima T,

исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы
это статик уровня контекста исполнения. вот сдесь хорошо видно. FS сегмент указывает на thread блок. Если посмотреть на результат работы MSVC 2017 то там GS указывает на thread блок
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534546
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вЪюkealon(Ruslan)Dima T,

исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы
это статик уровня контекста исполнения. вот сдесь хорошо видно. FS сегмент указывает на thread блок. Если посмотреть на результат работы MSVC 2017 то там GS указывает на thread блок
вот ж блин, отстал от жизни
реально префикс сегментного дескриптора стали использовать, молодцы

по идее тогда тормозов сильных не должно быть
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534550
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но и ограничения суровые

авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534602
вЪю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)но и ограничения суровые

авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary.
Типа мы вас предупредили. И что будет при лениво загруженной библиотеке с thread_local? Любимый синий экран?

Microsoft specific.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534621
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вЪюthread_local так же как и static уже проинициализирован нулями.
Действительно все так. Убрал, наследование скомпилировалось, тормозов не добавилось. Попробую дописать как изначально планировал.
Спасибо.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534634
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)но и ограничения суровые

авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary.
Собственно поэтому и мастерю велосипед с вызовом Tls* вместо thread_local.
Как понимаю в XP лезет в несуществующую память и вылетает. Наступал уже на эти грабли 16963764
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534796
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct B : public A {
	int x;
	int y;
};

void test() {
	thread_local B b;
...


Все работает, нулями инициализируется, тормозов не добавилось.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39534995
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе работает
Поторопился хвастаться, под XP не работает :(

Точнее EXE работает и с thread_local и с Tls*(), а DLL просто убивает процесс. И thread_local похоже тут ни при чем.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто объяснит или подскажет куда копать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	struct static_info_t {
		lite_name_idx_t la_name_idx;// Индекс для поиска lite_actor_t* по имени
		lite_mutex_t mtx_idx;		// Блокировка для доступа к la_idx. 
		lite_actor_list_t la_list;	// Список акторов
		lite_mutex_t mtx_list;		// Блокировка для доступа к la_list
		lite_resource_t* res_default;// Ресурс по умолчанию
		std::atomic<bool> is_destroy;// Идет удаление всех акторов
	};

	static static_info_t& si() noexcept {
		MessageBox(0, "1", "static_info_t& si()", 0);
		static static_info_t x;
		MessageBox(0, "2", "static_info_t& si()", 0);
		return x;
	}


Что происходит в XP DLL: первый MessageBox() срабатывает, после прога вылетает.

Как я понимаю выделенная строчка должна отработать не при вызове si(), а при старте, т.е. в случае с DLL в момент ее загрузки в память. Поэтому MessageBox`ы должны вызываться один за другим, но ничего подобного, первый MessageBox есть, второго нет. Жесть какая-то. Мыслей нет, куда копать непонятно.

В Win7 DLL все работает.

PS MSVC2015, исходники могу дать.

Так в ассемблере отладчик показывает, но я в нем слабо разбираюсь
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
		MessageBox(0, "1", "static_info_t& si()", 0);
57B02162  push        0  
57B02164  push        offset string "static_info_t& si()" (57B473C4h)  
57B02169  push        offset string "1" (57B4736Ch)  
57B0216E  push        0  
57B02170  call        dword ptr [__imp__MessageBoxA@16 (57B3F1C4h)]  
		static static_info_t x;
57B02176  mov         eax,dword ptr fs:[0000002Ch]  
57B0217C  mov         ecx,dword ptr [_tls_index (57B505C8h)]  
57B02182  mov         ecx,dword ptr [eax+ecx*4]  
57B02185  mov         eax,dword ptr [TSS0<`template-parameter-2',lite_actor_t::i,signed char,lite_actor_t::Ustatic_info_t &,void,int, ?? &> (57B510B4h)]  
57B0218A  cmp         eax,dword ptr [ecx+4]  
57B02190  jle         lite_actor_t::si+84h (57B021C4h)  
57B02192  push        offset TSS0<`template-parameter-2',lite_actor_t::i,signed char,lite_actor_t::Ustatic_info_t &,void,int, ?? &> (57B510B4h)  
57B02197  call        _Init_thread_header (57B08A8Dh)  
57B0219C  add         esp,4  
57B0219F  cmp         dword ptr [TSS0<`template-parameter-2',lite_actor_t::i,signed char,lite_actor_t::Ustatic_info_t &,void,int, ?? &> (57B510B4h)],0FFFFFFFFh  
57B021A6  jne         lite_actor_t::si+84h (57B021C4h)  
57B021A8  call        lite_actor_t::static_info_t::static_info_t (57B02FA0h)  
57B021AD  push        offset `lite_actor_t::si'::`2'::`dynamic atexit destructor for 'x'' (57B3E9E0h)  
57B021B2  call        atexit (57B08EF7h)  
57B021B7  push        offset TSS0<`template-parameter-2',lite_actor_t::i,signed char,lite_actor_t::Ustatic_info_t &,void,int, ?? &> (57B510B4h)  
57B021BC  call        _Init_thread_footer (57B08A4Eh)  
57B021C1  add         esp,8  
		MessageBox(0, "2", "static_info_t& si()", 0);
57B021C4  push        0  
		MessageBox(0, "2", "static_info_t& si()", 0);
57B021C6  push        offset string "static_info_t& si()" (57B473C4h)  
57B021CB  push        offset string "2" (57B47378h)  
57B021D0  push        0  
57B021D2  call        dword ptr [__imp__MessageBoxA@16 (57B3F1C4h)]  
		return x;
57B021D8  mov         eax,offset x (57B51050h)  
	}
57B021DD  mov         ecx,dword ptr [ebp-0Ch]  
57B021E0  mov         dword ptr fs:[0],ecx  
57B021E7  pop         ecx  
57B021E8  mov         esp,ebp  
57B021EA  pop         ebp  
57B021EB  ret  

...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535020
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники тут

Компилирую в MSVC 2015 c Platform toolset = v140_xp

Потом из Win7 копирую DLL в XP.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535024
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем непонятно почему static не совсем static и смущает строчка из асма
Код: plaintext
1.
57B0217C  mov         ecx,dword ptr [_tls_index (57B505C8h)]  


TLS и static вроде как разные вещи.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535082
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535141
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima T,

DllMain и жизнь до родов
Спасибо, не знал.
Чуть поправил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
TEST_API void fntest(const char* str) {
	static bool is_init = false;
	if(!is_init) {
		start();
		is_init = true;
	}
	lite_log(0, str);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		//start();
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		//stop();
		break;
	}
	return TRUE;
}


Вылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.

Странно что с этим static нет проблем. Попробую методом научного тыка переписать те static похожим способом.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535168
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Методом научного тыка выявлено что помогает замена
Код: plaintext
1.
2.
3.
4.
	static static_info_t& si() noexcept {
		static static_info_t x;
		return x;
	}


на указатель
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	static static_info_t& si() noexcept {
		static static_info_t* x;
		if(x == NULL) {
			x = new static_info_t();
		}
		return *x;
	}


Вылетать в XP перестало. Правда еще не заработало как надо.

Похоже MSVC зачем-то использует TLS при компиляции static переменных, непонятно зачем. Может это как-то с конструкторами связано, т.к. у меня почти в каждом классе своя struct static_info_t и внутри stl-контейнеры и т.п.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535184
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заработало! Победил DLL под XP.

Еще нельзя так писать
Код: plaintext
1.
static uint32_t x = TlsAlloc();


так работает
Код: plaintext
1.
2.
static uint32_t x = TLS_OUT_OF_INDEXES;
if (x == TLS_OUT_OF_INDEXES) x = TlsAlloc();



Осталось понять как с этим жить, т.е. как код поправить чтобы тормозов не добавить.
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535247
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.
а как ты с dll связываешь, статически надеюсь?
...
Рейтинг: 0 / 0
Наследование и инициализация
    #39535272
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Dima TВылетает там же, но стало лучше :) Процесс не исчезает молча, а происходит перехват обращения к несуществующей памяти через SEH на стороне EXE, вызывающего DLL.
а как ты с dll связываешь, статически надеюсь?
Если статически (неявно), то проблемы не будет, если я правильно понял предупреждение от MS 20860246 . Т.е. thread_local и static нормально будут работать без всяких нездоровых дописок в коде.

Проблема в том что мне надо из FoxPro вызывать, а там можно только явно загружать DLL, т.е. через LoadLibrary().
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наследование и инициализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]