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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| typedef struct msg_block_tag{
volatile DWORD f_ready, f_stop;
volatile DWORD sequence;
time_t timestamp;
CRITICAL_SECTION mguard;
DWORD data[256];
} MSG_BLOCK;
//prototypes
DWORD WINAPI ThreadProc(LPVOID lpParam);
DWORD WINAPI ThreadProcRec(LPVOID lpParam);
void AffichageMessage(MSG_BLOCK *);
void CreerMessage(MSG_BLOCK *);
CRITICAL_SECTION crit_sec;
HANDLE hSemaphore;
MSG_BLOCK mblock = {0,0,0,0,0};
//fonction principale
DWORD _tmain(DWORD argc, LPTSTR argv [])
{
DWORD ThreadId;
HANDLE hThread[3];
int i;
InitializeCriticalSection(&crit_sec);
hSemaphore = CreateSemaphore( NULL,2,2,NULL);
for(i=0;i<2;i++)
hThread[i] = CreateThread(NULL, NULL, ThreadProc, NULL, NULL, &ThreadId);
printf("probleme\n");
hThread[2] = CreateThread(NULL, NULL, ThreadProcRec, NULL, NULL, &ThreadId);
WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
printf("probleme\n");
CloseHandle(hSemaphore);
DeleteCriticalSection(&crit_sec);
CloseHandle(hThread);
printf("appuyer sur une touche!\n");
getch();
return 0;
}
void AffichageMessage(MSG_BLOCK *mblock)
{
DWORD i, t_block = 0;
for(i=0;i<256;i++)
t_block ^= mblock->data[i];
printf("message numero %d\n",mblock->sequence);
return;
}
//Procédure de creation de message
void CreerMessage(MSG_BLOCK *mblock)
{
DWORD i;
for(i=0;i<256;i++)
mblock->data[i] = rand();
mblock->timestamp = time(NULL);
return ;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
WaitForSingleObject(hSemaphore, INFINITE);
//Pour ecrire sur la console
EnterCriticalSection(&crit_sec);
printf("Thread %d demarre\n",(int)lpParam);
LeaveCriticalSection(&crit_sec);
Sleep(500);
//Pour ecrire un message
srand ((DWORD)time(NULL));
// while(!mblock.f_stop){
Sleep(rand()/100);
EnterCriticalSection(&mblock.mguard);
if (!mblock.f_stop)
{
mblock.f_ready = 0;
// CreerMessage(&mblock);
mblock.f_ready = 1;
mblock.sequence++;
}
LeaveCriticalSection (&mblock.mguard);
// }
//
//Pour ecrire sur la console
EnterCriticalSection(&crit_sec);
printf("Thread_recep %d termine\n",(int)lpParam);
LeaveCriticalSection(&crit_sec);
ReleaseSemaphore(hSemaphore,1,NULL);
return 0;
}
DWORD WINAPI ThreadProcRec(LPVOID lpParam)
{
WaitForSingleObject(lpParam, INFINITE);
//Pour ecrire sur la console
EnterCriticalSection(&crit_sec);
printf("Thread %d demarre\n",(int)lpParam);
LeaveCriticalSection(&crit_sec);
Sleep(500);
//Pour afficher le message
/* EnterCriticalSection(&mblock.mguard);
if(!mblock.f_stop==0){
AffichageMessage(&mblock);
mblock.f_ready=0;}
LeaveCriticalSection(&mblock.mguard);
*/
//Pour ecrire sur la console
EnterCriticalSection(&crit_sec);
printf("Thread %d termine\n",(int)lpParam);
LeaveCriticalSection(&crit_sec);
return 0;
} |
Partager