Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  API Thread Synchronisation, irgendwas mach ich falsch.     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
ChrisCross+
Unregistrierter




Beitrag ChrisCross+ Unregistrierter 14:08:51 24.03.2012   Titel:   API Thread Synchronisation, irgendwas mach ich falsch.            Zitieren

Guten Tag,
ich versuche mich zum ersten mal an Threads...das Thema habe ich immer
gemieden aber irgendwie reizt es mich trotzdem.
Ich teste eigentlich ein einfaches Beispiel und hatte mir als Ergebnis
folgendes in der Konsole erhofft:

Zitat:

Starting both Threads...
0
1
2
3
4
5
Closing both Threads...


Doch irgendwie habe ich einen Denk(Syntax)fehler und bekomme immer eine
unsaubere Zahlenkette in der Konsole raus :(

Ich wäre für jede Hilfe dankbar <3
(Hatte zuerst mit Mutex dann mit Critical Section getestet, bei beiden das gleiche Problem)

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
59
60
61
62
63
64
65
#include <Windows.h>
#include <WindowsX.h>
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
int fu = 0;
//HANDLE mutex = CreateMutex(NULL, false, NULL);
CRITICAL_SECTION crit;
 
void thread_1()
{
    //WaitForSingleObject(mutex, INFINITE);
    EnterCriticalSection(&crit);
    cout << fu << endl;
    LeaveCriticalSection(&crit);
    //ReleaseMutex(mutex);
}
 
 
void thread_2()
{
    //WaitForSingleObject(mutex, INFINITE);
    EnterCriticalSection(&crit);
    fu++;
    LeaveCriticalSection(&crit);
    //ReleaseMutex(mutex);
}
 
int main()
{
    InitializeCriticalSection(&crit);
 
    cout << "Starting both Threads..." << endl;
 
    LPVOID func_id_1 = "1";
    LPVOID func_id_2 = "2";
 
    DWORD thread_id_1 = 1;
    DWORD thread_id_2 = 2;
 
    for(int i = 0; i < 5; i++)
    {
 
    HANDLE h_thread[1];
 
    h_thread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_1, &func_id_1, 0, &thread_id_1);
    h_thread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_2, &func_id_2, 0, &thread_id_2);
 
    //WaitForSingleObject(h_thread[0], INFINITE);
    //WaitForSingleObject(h_thread[1], INFINITE);
    WaitForMultipleObjects(2, h_thread, true, INFINITE);
 
    CloseHandle(h_thread[0]);
    CloseHandle(h_thread[1]);
 
    }
    cout << "Closed both Threads..." << endl;
 
    DeleteCriticalSection(&crit);
    //CloseHandle(mutex);
    Sleep(5000);
    return 0;
}
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 5639
Beitrag dot Mitglied 14:27:47 24.03.2012   Titel:              Zitieren

Mit der Critical Section stellst du nur sicher, dass die Threads nicht gleichzeitig auf die Konsole schreiben. Die Reihenfolge in der sie das tun ist aber völlig zufällig.

_________________
one point of view will never reveal the entire scene.
Hi
Unregistrierter




Beitrag Hi Unregistrierter 14:42:49 24.03.2012   Titel:   Re: API Thread Synchronisation, irgendwas mach ich falsch.            Zitieren

Auf den ersten Blick...

ChrisCross+ schrieb:
...und hatte mir als Ergebnis
folgendes in der Konsole erhofft:

Wie das? Du kannst nicht steuern, welcher Thread zuerst abgearbeitet wird. Es kann also sein, dass thread2 zuerst ausgeführt wird und somit auch zuerst die CS bekommt.

Und ein Fehler: HANDLE h_thread[2];
ChrisCross+
Unregistrierter




Beitrag ChrisCross+ Unregistrierter 02:00:04 25.03.2012   Titel:   re            Zitieren

Gibt es also keine Moeglichkeit die Reihenfolge zu kontrollieren mit der die Threads auf die Variable zugreifen?
Vielen Dank fuer eure Antworten :)
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4095
Beitrag theta Mitglied 10:18:57 25.03.2012   Titel:              Zitieren

Doch, z.B. mit Events (CreateEvent)
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 14218
Beitrag Martin Richter Moderator 10:39:31 25.03.2012   Titel:   Re: re            Zitieren

ChrisCross+ schrieb:
Gibt es also keine Moeglichkeit die Reihenfolge zu kontrollieren mit der die Threads auf die Variable zugreifen?
Vielen Dank fuer eure Antworten :)


Nein!
Wenn Du das willst müsstest Du selbst eine Queue aufbauen und dann in diesen die entsprechenden Events signalisieren...

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
ChrisCross+
Unregistrierter




Beitrag ChrisCross+ Unregistrierter 12:05:20 25.03.2012   Titel:   API Thread Synchronisation, irgendwas mach ich falsch.            Zitieren

Ah das mit den Events ist ziemlich gut :D
Vielen Dank an Alle <3
c++.de :: WinAPI ::  API Thread Synchronisation, irgendwas mach ich falsch.   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.