Pobranie id wątku wykonującego funkcje

0

Witam.

Jak mogę pobrać id wątku, który wykonuje funkcję?

Przykładowo chodzi mi o cos takiego

void funkcja()
{
plik->zapisz(GetThreadId());
}

Ten wątek, który wykona tą funkcje zapisze swój id do pliku.

Potrzebne mi to jest dlatego że chce zrobić "inteligentne" sekcje krytyczne.

Jeżeli w każdej funkcji używam locka (i w tych przeciązonych) to mogę się zdeadlockować.

A tak gdy będe miał zapisany id ostaniego wątku który wywołał sekcje krytyczną, to będę mógł zignorować locka jeżeli założył go ten sam wątek w poprzedniej funkcji.

0
Yrok napisał(a)

Jak mogę pobrać id wątku, który wykonuje funkcję?
Dokładnie tak jak pokazałeś na przykładzie.

Yrok napisał(a)

Jeżeli w każdej funkcji używam locka (i w tych przeciązonych) to mogę się zdeadlockować
Nie będzie dadlock'a.

MSDN napisał(a)

After a thread has ownership of a critical section, it can make additional calls to EnterCriticalSection or TryEnterCriticalSection without blocking its execution. This prevents a thread from deadlocking itself while waiting for a critical section that it already owns. The thread enters the critical section each time EnterCriticalSection and TryEnterCriticalSection succeed. A thread must call LeaveCriticalSection once for each time that it entered the critical section.

0

Niewiem czy dobrze zrozumiałem, sorry ale nie znam za dobrze angielskiego

Generalnie chodziło mi o to:

mam jakies funkcje i w tych funkcjac wywołuje funkcje

void funkcja()
{
ZAKLADAM LOCKA
//cos sie dzieje

funkcja2();

//cos sie dzieje
ZDEJMUJE LOCKA
}

void funkcja2()
{
ZAKLADAM LOCKA

//cos sie dzieje

ZDEJMUJE LOCKA
}

i chce po prostu żeby w każdej funkcji był lock, a nie tylko w jednej (głównej) ale wtedy deadlock jest (przynajmniej jak używam w ZAKLADAM LOCKA - EnterCriticalSection).

I z tego co zrozumiałem Jeżeli zamiast EnterCriticalSection(lock)
będe używał

while(!TryEnterCriticalSection(&lock))
{
}

to to będzie odporne na dead locka?

Testowałem i i tak się deadlockuje.

Może coś źle robie.

Pozdrawiam.

0

Chodzi o to, że nie musisz się martwić bo nie będzie deadlocka. Możesz używać z jednego wątku ile razy chcesz EneterCriticalSection i/lub TryEneterCriticalSection i nie będzie deadlocka, trzba tylko tyle samo razy wywołać LeaveCriticalSection, dokładnie tyle samo co wywołań EneterCriticalSection plus tyle samo co wywołań TryEneterCriticalSection które zwrócą true.

I nie przejmuj się, że nie znasz za bardzo angielskiego - czytaj, czytaj, czytaj (ze słownikiem pod ręką - polecam ling.pl). Ja się tak nauczyłem sporo. Co prawda samodzielne wypowiadanie się nie jest takie całkiem easy, ale żaden tekst do przeczytania mi nie sprawia większych problemów. Bez umiejętności czytania angielskich tekstów to w programowaniu będziesz się rozwijać bardzo wolno.

0

yrok, testowy - mozesz w koncu zdecydowac sie na jeden nick? osoby z ktorymi rozmawiasz i tak wiedza ze to Ty, i wiedza dokladnie jaki projekt tworzysz. jaki jest sens w bawieniu sie w chowanego poza wkurzaniem innych i utrudnianiem wyszukiwania watkow?

1 użytkowników online, w tym zalogowanych: 0, gości: 1