1

Тема: Непорозуміння з потоками

Усім доброго вечора.
Трішки практикую з потоками, і.. виникло недоуміння від наступного:

proc ThreadProc
    locals
        buf rb 10
    endl

    xor ecx, ecx
    inc ecx
@@: push ecx
    cinvoke wsprintfA, addr buf, frmt, ecx
    invoke OutputDebugStringA, addr buf
    invoke Sleep, 1000
    pop ecx
    inc ecx
    jmp @b

    ret
endp


entry $

    invoke CreateThread, 0, 0, ThreadProc, 0, 0, lpThreadId
    mov [hProcess], eax

    invoke Sleep, 1000 * 2
    invoke OutputDebugStringA, fin

    invoke TerminateProcess, [hProcess], 0
    invoke CloseHandle, [hProcess]
    invoke ExitProcess, 0


    fin         db 'finish', 0
    frmt        db '%d', 0
    lpThreadId  rd 1
    hProcess    rd 1

http://i67.fastpic.ru/big/2015/0203/22/6fbff8d2e6806f94c185555fb0a1d822.png

..тобто послідовний запуск програми (5 разів), дає дивний результат - то 1, 2 то 1, 2, 3. Хоча логічніше буде саме 1, 2.
Це так треба, чи десь моя недоробка?)

2

Re: Непорозуміння з потоками

Опишіть детальніше завдання, будь ласка.

3

Re: Непорозуміння з потоками

Ярослав написав:

Опишіть детальніше завдання, будь ласка.

Та конкретного завдання нема, авантюрний код.
Процедура потоку, в нескінченному циклі, інкрементує та друкує вміст регістру ecx, з інтервалом в 1 сек. Так як після CreateThread одразу іде пауза на 2 сек., то я розраховував, що отримаю рівно дві ітерації (1, 2) у ThreadProc, але, іноді, чомусь відбуваються три ітерації (1, 2, 3). Чому - питання.

4

Re: Непорозуміння з потоками

Sleep це "ненадійний метод" вимірювання часу, тобто коли пишеш X часу це значить X+ часу, в залежності від приорітетів інших потоків.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: Kane, koala2

5

Re: Непорозуміння з потоками

Давайте розглянемо можливу ситуацію: проходить приблизно дві секунди, в головному потоці виконання на 26 рядку, тобто залишається закинути в стек fin і викликати OutputDebugStringA.
В "цей" момент в створеному потоці виконання наприклад на 12, тобто після другого сну (пройшло 2 секунди).
І тут ядро вирішує дати порцію часу створеному потоку який панічно виконує 12 13 14 8 9 10, тобто виводить 3.
Як бачимо то залежить від удачі потоку що підтверджує вивід.

Maybe a = Just a | Nothing
Подякували: 0xDADA11C7, Kane2

6 Востаннє редагувалося Alchimic (29.01.2018 19:59:11)

Re: Непорозуміння з потоками

постав більшй сліп. по ідеї поможе. прична - недостатній сліп по завершенню потока. там де 1000*2 треба 1000*4  або там де 1000 поставити 500.

(цей допис зроблено ботом. можете не звертати на нього уваги)
(цей підпис зроблено адміном. можете не звертати на нього уваги)