powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
25 сообщений из 308, страница 9 из 13
Си. Освободить память 2-мерного сторкового массива
    #40131646
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо читать книжки по архитектуре Linux. Я точно всех типов не помню но кажется pipes, sockets, и файловые
дескрипторы - это один и тот-же тип ресурса с точки зрения Linux.

Почему их надо ограничивать? Ну наверное потому что это не просто целое число или указатель. Это какая-то структура
в памяти которая имеет размеры (очень актуально для TCP). И просто огульное использование открытых одновременно
файлов или сокетов может скушать память.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131649
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того сам PG-драйвер тоже на каждый сеанс может что-то аллоцировать. Переменные сеанса.
Буфера для батчинга. Тоесть не только TCP сокет но и еще некое неизвестное X умножается на 1000 в твоейм кейсе.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132526
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Да, тестирую, коннекты, судя по всему занимают открытые файлы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132528
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сталкнулся еще с такой проблемой:

Код: plaintext
1.
sleep(1) 


При компиляции для Linux и Windows - это 1 сек и 0.001 сек сотвественно.


Причем в виндоус sleep c большой буквы - Sleep.


Подскажите, может быть есть какая-то универсальная задержка и под вин и под линукс?


Если нет, то как это обходить?


Переменную объявлять что за ОС и в зависимости от нее ставить sleep(1) или Sleep(1000)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132533
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.


Понял, спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132537
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От sleep() в секундах мало пользы, обычно надо покороче паузы. Для этого в линуксе есть nanosleep()
Код: plaintext
1.
2.
3.
4.
5.
6.
void Sleep(int msec) {
    struct timespec t;
    t.tv_sec  =  msec / 1000;
    t.tv_nsec = (msec % 1000) * 1000000;
    nanosleep (&t, NULL);
}
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача же вроде бы была "сделать чтобы работало быстрее", нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132547
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
От sleep() в секундах мало пользы, обычно надо покороче паузы. Для этого в линуксе есть nanosleep()
Код: plaintext
1.
2.
3.
4.
5.
6.
void Sleep(int msec) {
    struct timespec t;
    t.tv_sec  =  msec / 1000;
    t.tv_nsec = (msec % 1000) * 1000000;
    nanosleep (&t, NULL);
}



Да, я его тоже использую, вот так:

Код: plaintext
1.
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132548
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Задача же вроде бы была "сделать чтобы работало быстрее", нет?..
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132549
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
pthreads переносима
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
pthreads переносима

Ну ОК. Просто не видел чтоб кто-то под Windows затаскивал такие порты.

Я не против тогда. Пускай берет pthreads.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я лично сделал наоборот: портировал _beginthreadex() на линух.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, а как ты реализовал

Код: plaintext
1.
EnterCriticalSection(...)



?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132560
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Siemargl
пропущено...
pthreads переносима

Ну ОК. Просто не видел чтоб кто-то под Windows затаскивал такие порты.

Я не против тогда. Пускай берет pthreads.
С mingw идет в коробке, я пробовал, под msvc есть в nuget да и вообще
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132567
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Да, я его тоже использую, вот так:

Код: plaintext
1.
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);


Это С++ конструкция такая или Си?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132568
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Я лично сделал наоборот: портировал _beginthreadex() на линух.

И в чём заключалось такое портирование? Просто как я понимаю _beginthreadex() настраивает Си-рантайм для MSVC.
Как вы это портировали не очень понятно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132570
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonа как ты реализовалEnterCriticalSection
Это я не эмулировал, использую обёртку:
Код: sql
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
class CriticalSection
{
#ifdef __WIN32__
	CRITICAL_SECTION s;
#else
     // Most likely fast mutex is enough, but as long as performance problems 
are not reported,
     // let's play safetly
     pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
#endif
public:
	CriticalSection(unsigned SpinCount = 0)
	{
#ifdef __WIN32__
         InitializeCriticalSectionAndSpinCount(&s, SpinCount);
#else
         (void)SpinCount;
         // pthread_mutex_init(); Not needed as mutex is initialized statically
#endif // __WIN32__
     }
	CriticalSection(const CriticalSection&) = delete;   // Cannot be copied
	CriticalSection(const CriticalSection&&) = delete;  // Cannot be moved

	~CriticalSection()
     {
#ifdef __WIN32__
         DeleteCriticalSection(&s);
#else
         pthread_mutex_destroy(&m); // Most likely no-op
#endif // __WIN32__
     }

	void enter()
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }

	void leave()
	{
#ifdef __WIN32__
         LeaveCriticalSection(&s);
#else
         assert_perror(pthread_mutex_unlock(&m));
#endif // __WIN32__
     }
};


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132572
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravИ в чём заключалось такое портирование?

Так же как с остальной пачкой используемого мною Win32 API: я открыл
спецификацию на MSDN и написал процедуру, реализующую этот функционал на линухе.

Мне сугубо всё равно что оно творит "унутре" себя на винде пока я могу просто
скомпилировать исходник своего приложения и получить тот же результат.

PS: В случае с критической секцией выше мне просто пока лень разбираться с футексами чтобы эмулировать busy wait.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132573
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА был-ли бенчмарк который сравнивает вот эти две реализации?

Не было. В моём приложении нет коротких потоков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132580
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }


А что означает «короткий поток»? Время жизни потока небольшое? Странная терминология.
И как от времени жизни потока может зависеть время блокирования мьютекса?
Теоретически, в определённых ситуация критическая секция выигрывает, потому что в начале использует спин лок.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Про 200 мс это я конечно загнул. Надо чтоб поток хоть какую-то полезную задачу сделал.

Ну вобщем вопрос был в части энерго-эффективности EnterCriticalSection, особенно когда попыток
много на единицу времени.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132612
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу вобщем вопрос был в части энерго-эффективности EnterCriticalSection, особенно
когда попыток много на единицу времени.

Да, именно для этого в линухе футексы и комментарий в моём исходнике. Когда
придёт время для оптимизации - буду копаться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132645
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }


Если не путаю линуксовый мутекс не тоже самое что виндовый мутекс, он менее функционален, его в другой процесс не передашь.
Поэтому он по реализации ближе к критической сессии, может блокироваться без переключения в режим ядра, за счет этого быстрее.
...
Рейтинг: 0 / 0
25 сообщений из 308, страница 9 из 13
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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