LINUX.ORG.RU

Как по правильному сделать механизм хранения статических строк для каждого треда?

 ,


1

2

Так, как делают некоторые системные функции. Чтобы внутри есть статический буфер, куда какая-нибудь функция складывает свой результат, но чтобы если ее вызвали из другого потока она не перекрыла результат первого.

В голову идет только динамический массив структур, каждая из которых содержит буфер и thread_id. И каждый раз при обращении проверять, если такой тред и если нет - расширять массив, и выдавать новый буфер. Минусы - не почистится буфер при выходе и анализаторы будут гудеть. Еще время поиска, когда много тредов оно в теории может быть менее выгодно чем malloc/free.

Как это реализуют нормальные люди? Количество тредов не определено, может быть 5, может быть 50, может быть 500.

★★★★★

Так, как делают некоторые системные функции. Чтобы внутри есть статический буфер, куда какая-нибудь функция складывает свой результат, но чтобы если ее вызвали из другого потока она не перекрыла результат первого.

Почти все делают. Буфер там int, потому malloc/free на такой размер не нужен, просто меняется глобальная переменная на указатель на память в локальный стек треда. Где не int, те точно помечены как не для тредов и есть модификации с *_r. Так что если надо много памяти, то придётся таки malloc/free аккуратно ручками.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от xaizek

Спасибо за название. Судя по всему готовые решения есть только в C11. У нас утилиты на c89, основной код на gnu99

C and C++[edit]
In C11, the keyword _Thread_local is used to define thread-local variables. The header <threads.h>, if supported, defines thread_local as a synonym for that keyword. Example usage:

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Про pthread_key_create сейчас почитаю, спасибо.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Спасибо, как раз то что нужно.

PPP328 ★★★★★
() автор топика

Как это реализуют нормальные люди?

Нормальные люди так не делают. Некоторое количество функций, использующих статические буферы, сохранились с древних времён, но сейчас у каждой такой функции есть _r вариант: asctime_r, asctime_r, strerror_r, etc.

debugger ★★★★★
()
Ответ на: комментарий от debugger

Это не очень удобно с точки зрения слежения за всеми результативными переменными. Постоянно перевыделять на стеке буфера, если можно юзать один на тред.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Программировать на си вообще не удобно. Потом кто-то захочет сделать типа

printf("%s %s\n", asctime(t1), asctime(t2));
и огорчится.

vzzo ★★★
()
Ответ на: комментарий от vzzo

Почему огорчится? Порадуется великому и могучему Си. Там и поддержка временных поясов великолепная и много чего ещё.

dzidzitop ★★
()
Ответ на: комментарий от PPP328

Это не очень удобно с точки зрения слежения за всеми результативными переменными. Постоянно перевыделять на стеке буфера, если можно юзать один на тред.

М-да. Ты никогда не думал, почему появились ascitime_r и подобные? Ведь можно было добавить одно слово __thread в в реализацию ascitime, и получить тред-сейф нахаляву при сохранении прежнего интерфейса. Удобно же, а?

Впрочем, делай как знаешь. Каждый имеет право набивать свои шишки.

debugger ★★★★★
()
Ответ на: комментарий от debugger

М-да. Ты никогда не думал, почему появились ascitime_r и подобные?

Что-то мне подсказывает, что в стародание времена не _r версии использовали один и тот же буфер для всех потоков.

anonymous
()
Ответ на: комментарий от vzzo

printf(«%s %s\n», asctime(t1), asctime(t2));

Этот код не имеет смысла. Да и вообще программирование на си требует вдумчивости и знания АПИ. Кодомартышки пусть идут в пхп.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Этот код не имеет смысла. Да и вообще программирование на си требует вдумчивости и знания АПИ. Кодомартышки пусть идут в пхп.

Очевидно, что себя кодомартышкой ты не считаешь? Хотя, что я спрашиваю… Адью.

debugger ★★★★★
()
Ответ на: комментарий от PPP328

программирование на vhdl требует вдумчивости и знания АПИ. Кодомартышки пусть идут в c.

Обвиоус фикс

anonymous
()
Ответ на: комментарий от debugger

Эх-ма, как у пхпышника полыхнуло.

PPP328 ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Спасибо за название. Судя по всему готовые решения есть только в C11. У нас утилиты на c89, основной код на gnu99

Как это? Готовое решение есть в POSIX.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Имеете в виду pthread_key_create? Слишком переусложнено. Сделали через gnu-расширение __thread.

PPP328 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.