Отследить удаление потока

Тема в разделе "WASM.WIN32", создана пользователем DevilDevil, 31 май 2020.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    :dash1:
     
  2. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    По идее pthread_cleanup_push это макрос, надо посмотреть, во что он разворачивается
    Чёт у меня пока не получается, какой-то while требует: https://godbolt.org/z/6_AZiP
     
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.455
    Адрес:
    Россия, Нижний Новгород
    Посмотри в исходниках самого pthread'а, как он создаёт потоки на самом низком уровне
    --- Сообщение объединено, 2 июн 2020 ---
    DevilDevil, https://man7.org/linux/man-pages/man2/clone.2.html
     
  4. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    Я пытался понять исходники pthread.h - возникло ощущение, что он на низком уровне прописывает калбек. Но нужно для начала понять, что там вообще внутри происходит )
     
  5. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    Ладно, буду юзать фиберы. Всем спасибо
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
  7. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    DevilDevil,

    Я смысл не понимаю. Обычно нужен высокий профайл, пропускная способность. Тоесть запрос на аллокацию должен происходить как можно быстрее. Для этого резервируется большой блок и всего лишь синхронно(атомарно) увеличивается указатель на размер блока. Для оптимизации обьёма памяти нужен некоторый слой отображения(таблицы трансляции).

    Если же гонять блоки туда сюда в каких то списках, то в этом смысла нет, система сама это делает и лучше чем ты сделаешь(так как у тебя нет доступа к андок(нэйтив) ресурсам). Так вот какая цель ?
     
  9. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    В многопоточных приложениях бутылочное горлышко - это синхронизация. Как правило выделяются небольшие куски и в рамках одного потока. В этом случае эффективно создать кеш-кучу, ассоциированную с потоком. Большие куски или кросспотоковая рутина разруливается отдельно. В момент умерщвления потока нужно грамотно разруливать оставшуюся от него кеш-кучу. Я посмотрел, твою ссылку, здорово, что ты дошёл до хеш-таблиц. Но это кстати не самый быстрый доступ к данным. С другой стороны для твоей задачи это может быть оптимальное решение.
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    DevilDevil,

    > ты дошёл до хеш-таблиц. Но это кстати не самый быстрый доступ к данным.

    Я разве использовал хэши, ты тему не прочитал - если бы прочитал, то знал бы что они помогут для заранее известных указателей, либо их области, но не для рандом на всё адр простр.

    > Но это кстати не самый быстрый доступ к данным.

    Самое эффективное решение, из за него невозможно было реализовать бинарную трансляцию, так как вся суть её в быстрой аллокации. Эффективнее реализации нет; перейди порог 150M/аллокаций в sec :P

    > В многопоточных приложениях бутылочное горлышко - это синхронизация.

    Нет, это сервисное ожидание. Когда тред сменяет мод. Для начала потести, сними профайл на всё с чем ты имеешь дело, прежде чем что либо утверждать. Я это сделал давно, при разрабтке визора(дий), на это ушли года и каждый раз на любое действие - замер тайминга. Что бы знать где садится профайл, это самое важное для dbi, так как апп крутятся иногда даже часами.

    > В момент умерщвления потока нужно грамотно разруливать оставшуюся от него кеш-кучу.

    Я делал это просто. Поток запрашивает локальный блок(tls), все блоки помечены в битовой карте. Тогда скан этой карты(bsf). Если она заполнена, то цикл очистки - ThreadTimes, если тред завершён, тогда освобождение ресурсов. Незачем что либо ожидать, нотифи не нужны.

    Код (Text):
    1. ;
    2. ;    -= SYNC LOCAL STORAGE =-
    3. ;
    4. ; +
    5. ;
    6. PsOpenThread proc Tid:ULONG, Access:ULONG
    7. Local Cid:CLIENT_ID
    8. Local ThreadHandle:HANDLE
    9. Local ObjAttr:OBJECT_ATTRIBUTES
    10.     xor eax,eax
    11.     mov ecx,Tid
    12.     mov ObjAttr.uLength,sizeof(OBJECT_ATTRIBUTES)
    13.     mov ObjAttr.hRootDirectory,eax
    14.     mov ObjAttr.uAttributes,eax
    15.     mov ObjAttr.pSecurityDescriptor,eax
    16.     mov ObjAttr.pSecurityQualityOfService,eax
    17.     mov ObjAttr.pObjectName,eax
    18.     mov Cid.UniqueProcess,eax
    19.     mov Cid.UniqueThread,ecx
    20.     invoke ZwOpenThread, addr ThreadHandle, Access, addr ObjAttr, addr Cid
    21.     .if !Eax
    22.         mov eax,ThreadHandle
    23.         test ebx,ebx
    24.     .else
    25.         xor eax,eax
    26.     .endif
    27.     ret
    28. PsOpenThread endp
    29.  
    30. ; +
    31. ;
    32. TlsCleaningCycle proc uses esi edi
    33. Local Times:KERNEL_USER_TIMES
    34.     xor esi,esi    ; N
    35.     mov edi,G_TlsBase
    36.     assume edi:PTLS
    37.     .repeat
    38.         bt D G_TlsMap,esi
    39.         .if Carry?
    40.             invoke ZwQueryInformationThread, [Edi].Handle, ThreadTimes, addr Times, sizeof(KERNEL_USER_TIMES), NULL
    41.             .if !Eax
    42.                 mov ecx,D Times.ExitTime[0]
    43.                 mov edx,D Times.ExitTime[4]
    44.                 test ecx,edx
    45.                 .if !Zero?
    46.                     invoke ZwClose, [Edi].Handle
    47.                     lock bts D G_TlsMap,esi
    48.                 .endif
    49.             .endif
    50.         .endif
    51.         inc esi
    52.         add edi,sizeof(TLS)
    53.     .until Esi > 256
    54.     ret
    55. TlsCleaningCycle endp
    56.  
    57. ; +
    58. ; o Initial all bits set to 1.
    59. ;
    60. TlsQueryWorkSpace proc
    61. Scan:
    62.     xor ecx,ecx    ; N
    63.     lea edx,G_TlsMap
    64. @@:
    65.     bsf eax,D[edx][ecx*4]
    66.     .if Zero?
    67.         inc ecx
    68.         cmp ecx,8
    69.         jb @b
    70.         invoke TlsCleaningCycle
    71.         jmp Scan
    72.     .else
    73.         lock btr D[edx][ecx*4],eax
    74.         jnc Scan
    75.         ; P = N*32 + I
    76.         shl ecx,5
    77.         add eax,ecx
    78.     .endif
    79.     ret
    80. TlsQueryWorkSpace endp
     
  11. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    Indy_,

    Я автор менеджера памяти BrainMM, который по производительности обгоняет передовые разработки Intel и Google
    Я не хочу с тобой спорить о пользе или вреде тех или иных подходов
    Я хочу, чтобы ты мне помог отслеживать удаления потоков в POSIX
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    DevilDevil,

    > по производительности обгоняет передовые разработки Intel и Google

    Так значит выложи семпл для теста. Норм спец первым делом бы приводил статистику по профайлу, а не названия крупных контор. Чувак тут не школоборд любое утверждение нужно обосновать/доказать.
     
  13. DevilDevil

    DevilDevil Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2007
    Сообщения:
    101
    Indy_,

    Погугли BrainMM
    Есть уже бенчмарки, таблицы, примеры

    Я не хочу ничего доказывать
    Я пытаюсь понять, как в POSIX отследить завершение потока. В Windows это можно. В POSIX судя по наличию соответствующего макроса - тоже