Synchronization

Download Report

Transcript Synchronization

Project 2 教學
Synchronization Functions
in Windows
HANDLE WINAPI CreateSemaphore (
__in_opt LPSECURITY_ATTRIBUTES
lpSemaphoreAttributes,
__in LONG lInitialCount,
__in LONG lMaximumCount,
__in_opt LPCTSTR lpName );
EX:The max value for the semaphore Sem is 5, and its
initial value is 0
• HANDLE Sem;
• Sem = CreateSemaphore( NULL ,0 ,5 ,NULL);
Synchronization Functions
in Windows
DWORD WINAPI WaitForSingleObject (
__in HANDLE hHandle,
__in DWORD dwMilliseconds );
EX:to wait for a semaphore
WaitForSingleObject( Sem, INFINITE );
Synchronization Functions
in Windows
BOOL WINAPI ReleaseSemaphore (
__in
HANDLE hSemaphore,
__in
LONG lReleaseCount,
__out_opt LPLONG lpPreviousCount );
EX:to signal a sempahore
ReleaseSemaphore(Sem, 1, NULL);
Synchronization Functions
in Windows
HANDLE WINAPI CreateThread (
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in
SIZE_T dwStackSize,
__in
LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt LPVOID lpParameter,
__in
DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
EX: to create a thread to execute function ABC
CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)ABC,
NULL, 0,&ThreadID);
Synchronization Functions
in Windows
• #include <windows.h>
• #include <process.h>
• 可以使用Dev-c或VC
EX:Hw2 in Windows
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
int main(void)
{
full=CreateSemaphore( NULL ,0 ,5 ,NULL);
empty=CreateSemaphore( NULL ,5 ,5 ,NULL);
int j, *tid_arg;
srand((int)time(0));
printf("start\n");
tid_arg = (int *) malloc(sizeof(int));
*tid_arg = 1;
DWORD tid;
Thread[0]=CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)producer,
(void*)tid_arg, 0, &tid);
Thread[1]=CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)consumer,
(void*)tid_arg, 0, &tid);
WaitForMultipleObjects(2, Thread, TRUE, INFINITE);
system("pause");
return 0;
}
EX:Hw2 in Windows
•
•
void * producer(void *arg)
{
printf("p_in\n");
•
•
•
•
•
•
•
•
•
•
•
•
•
•
int i,tid,in_data;
tid = *((int *) arg);
free(arg);
for (i=0;i<12;i++){
WaitForSingleObject( empty, INFINITE);
Sleep(rand()%5);
in_data=rand()%256;
printf(">>p(%d) =(%d),buf[%d]\n", i, in_data,top);
buf[top] = in_data;
top=(top+1)%5;
ReleaseSemaphore(full, 1, NULL);
}
return 0;
}
EX:Hw2 in Windows
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
void * consumer(void *arg)
{
printf("c_in\n");
int i,tid,out_data;
tid = *((int *) arg);
free(arg);
for (i=0;i<12;i++){
WaitForSingleObject( full, INFINITE);
Sleep(rand()%10);
out_data=buf[down];
printf(">>c(%d) =(%d),buf[%d]\n", i, out_data,down);
down=(down+1)%5;
ReleaseSemaphore(empty, 1, NULL);
}
return 0;
}