edit:
Oeps titel vergeten. Kan iemand zo vriendelijk zijn ?
Oeps titel vergeten. Kan iemand zo vriendelijk zijn ?
Ik ben een fout aan het zoeken in een multi-thread programma en naar mijn gevoel is het een concurrency probleem. Nu ben ik aan het experimenteren om zeker te zijn welke code juist is en welke niet.
Onderstaand code is een programmaatje met 1 button. Telkens op de button wordt geklikt wordt er een extra thread gestart. De thread laat de globale variable 'a' met 10 verhogen. De uitvoer op het debug-scherm zouden dus altijd een veelvoud van 10 moeten zijn.
C++:
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
51
52
53
54
55
56
57
58
| // TreadTestDlg.cpp : implementation file // #include "stdafx.h" #include "TreadTest.h" #include "TreadTestDlg.h" int a=0; //NOT thread save CRITICAL_SECTION cs; UINT Thread1(LPVOID iDummy) { CString c; //int a=0; // thread save while(iDummy ==0) { EnterCriticalSection(&cs); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; Sleep(20); a++; LeaveCriticalSection(&cs); c.Format("%d\n", a); TRACE(c); Sleep(210); } return 0; } BOOL CTreadTestDlg::OnInitDialog() { CODE INGEKORT ... // TODO: Add extra initialization here InitializeCriticalSection(&cs); return TRUE; // return TRUE unless you set the focus to a control } void CTreadTestDlg::OnButton1() { CWinThread* hThread; x = 0; hThread = AfxBeginThread(Thread1, (void *)x, THREAD_PRIORITY_NORMAL, 131072); } |
Dit is de output die krijg (2x op de button geklikked). Iemand enig idee waarom die 71 en 91 er tussen staan?
10
20
30
40
50
60
71
80
91
100
[ Voor 5% gewijzigd door Baron op 01-12-2003 12:39 ]