Btw. wenn nur ein Thread auf eine Variable zugreift, kann man damit auch keine Threads synchronisieren...
Und wenn zwei Threads so synchronisiert sind, dass garantiert immer nur einer aktiv ist, dann brauche ich keine zwei Threads.
Hmpf, das is nur nen Beispiel... denk dir einfach im Thread2 anstelle von Sleep(0) andere Aufgaben die nicht syncronisiert werden müssen und im Thread1 einen Programmablauf, in dem halt ab und an mal Nachrichten an Thread2 geschickt werden müssen (die dann wieder in die unabhängige Bearbeitung einfließen...)
Und bitte jetzt nicht wieder das Beispiel hernehmen um die Sinnlosigkeit vom Prinzip zu erläutern xD
Es sollte inzwischen klar sein, dass das nicht der normale Weg für die Aufgabe ist.
// €dit: vergesst den Rest [€dit2: doch nich vergessen xD]
Um mal noch was zum Thema beizutragen... hab vor kurzem mal ne Klasse geschrieben, um Lese-und Schreibrechte in andere Klassen per Vererbung implementieren zu können.
Die Idee ist, genau einen Schreibzugriff
oder beliebig viele Lesezugriffe gleichzeitig zu erlauben.
|
C-/C++-Quelltext
|
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
class CriticalSectionManager
{
protected:
CriticalSectionManager()
{
_initCriticalSectionManager();
}
CriticalSectionManager(const CriticalSectionManager&)
{
_initCriticalSectionManager();
}
~CriticalSectionManager()
{
DeleteCriticalSection(&_guard);
DeleteCriticalSection(&_access);
}
CriticalSectionManager& operator =(const CriticalSectionManager& other)
{
return *this;
}
public:
void getReadaccess () const
{
EnterCriticalSection(&_guard);
BOOL result = TryEnterCriticalSection(&_access);
if (result == FALSE &&
InterlockedIncrement(&_read_access_count) == 1)
{
EnterCriticalSection(&_access);
}
else if (result == TRUE)
{
InterlockedIncrement(&_read_access_count);
}
LeaveCriticalSection(&_guard);
}
void getWriteaccess()
{
EnterCriticalSection(&_access);
}
void releaseReadaccess () const
{
if (InterlockedDecrement(&_read_access_count) == 0)
LeaveCriticalSection(&_access);
}
void releaseWriteaccess()
{
LeaveCriticalSection(&_access);
}
private:
void _initCriticalSectionManager()
{
_read_access_count = 0;
InitializeCriticalSection(&_guard);
InitializeCriticalSection(&_access);
}
mutable CRITICAL_SECTION _guard, _access;
mutable LONG _read_access_count;
};
|
€ditX: hab mal noch ne nicht mehr benötigte Variable rausgenommen - hatte vorher ja schon andere Ansätze mit Denkfehlern