Tải bản đầy đủ - 0 (trang)
XI.1 Process & Thread trong Microsoft Windows.

XI.1 Process & Thread trong Microsoft Windows.

Tải bản đầy đủ - 0trang

#include

#include

#include

int

int









N_Thread;

sum=0;



/* Number of threads started */



void ThreadProc( char *MyID )

{int i;

for (i=0; i<1000000; i++) { sum ++;}

N_Thread --;

_endthread();

}

void main()

{ int A=0, B=1, C=2, D=3;

N_Thread =4;

_beginthread( ThreadProc, 0, &A );

_beginthread( ThreadProc, 0, &B );

_beginthread( ThreadProc, 0, &C );

_beginthread( ThreadProc, 0, &D );



/* Create threads */



do {;} while(N_Thread >0);

printf("%d\n",sum);

}



4 thread chạy song song, hy vọng tổng nhận được sẽ là 4000000. Ấy vậy mà

trên thực tế thì khơng phải lúc nào cũng thu được kết quả như vậy. Chạy

trình 300 lần thì ¼ số trường hợp trình in ra kết quả nhỏ hơn.

Hiện tượng này chúng ta đã biết, đó là hiệu ứng rượt đuổi “race”. Nó xảy ra

là do các thread truy cập quá tự do vào biến “sum” và “N_Thread”. Nhiều

thread cùng “chen nhau” cộng vào một ô nhớ chung, vì vậy, có thể có thread

khơng thành cơng.

Trình sau đây sử dụng đoạn lệnh assemply để biến việc làm tranh nhau trên

thành tuần tự75.

#include

#include

#include











int

int

int



N_Thread;

sum=0;

mutex = 1;



/* Number of threads started */



75



Do chỉ phải thực hiện có 4 lần trừ, mỗi lần 1, cho nên khả năng xảy ra hiện tượng race với biến

N_Thread là rất ít.



391



void ThreadProc( char *MyID )

{int i;

for (i=0; i<1000000; i++) {

_asm

spin: lock

btr

_asm

jnc

sum ++;

_asm

bts

}

N_Thread --;

_endthread();

}

void main()

{ int A=0, B=1, C=2, D=3;

N_Thread =4;

_beginthread( ThreadProc, 0, &A );

_beginthread( ThreadProc, 0, &B );

_beginthread( ThreadProc, 0, &C );

_beginthread( ThreadProc, 0, &D );

do {;} while(N_Thread >0);

printf("%d\n",sum);

}



mutex, 0;

spin;

mutex, 0;



/* Create threads 4*/



/* waiting for threads are all leaved off*/



Kết quả cho thấy là (thời gian chạy trình thì chậm đi) khơng hề có hiện

tượng race nào trong số 300 lần chạy trình -- kết quả luôn là 4000000!



392



XI.3 Vùng CS (Critical Secsion).

Bảng so sánh cho thấy cách sử dụng mutex đối với windows thread.



393



Win 32 Microsoft Thread



Posix Thread



CRITICAL_SECTION CS_sum;

// Initialize a Critical Section



pthread_mutex_t



CS_sum;



InitializeCriticalSection(&CS_sum)

;

// Enter a critical Section



pthread_mutex_init(&CS_sum,NULL);



EnterCriticalSection(&CS_sum);



pthread_mutex_lock (&CS_sum);



....... //Access a shared resource



.... // access the shared resource



// Leave a Critical Section

LeaveCriticalSection(&CS_sum);



// Release the mutex

pthread_mutex_unlock (&CS_sum);



// Delete a Critical Section

DeleteCriticalSection(&CS_sum);



// Destroy / close the mutex

pthread_mutex_destroy (&CS_sum);



Trong trình sau, mutex được sử dụng để truy cập tuần tự vào một vùng CS

#include



#include



#include



CRITICAL_SECTION CS_sum;

HANDLE

LifeMutex[4];

/* Running threads mutex */

int

sum=0;

void ThreadProc( char *MyID )

{int i;

for (i=0; i<1000000; i++) {

EnterCriticalSection(&CS_sum);

sum ++;

LeaveCriticalSection(&CS_sum);

}

_endthread();

}

void main()

{ int i; int A[4]={1,2,3,4};

InitializeCriticalSection(&CS_sum);

for (i=0; i<4; i++) LifeMutex[i]=(HANDLE) _beginthread(ThreadProc, 0,&A[i] );

for(i=0; i<4; i++) WaitForSingleObject(LifeMutex[i], INFINITE);

printf("%d\n",sum);

DeleteCriticalSection(&CS_sum);

}



Trong trình sau 2 thread hoạt động song song cùng nhau ghi vào một file.

Mutex được sử dụng để tránh xung đột.

#include

#include

#include

#include

#include



394



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

XI.1 Process & Thread trong Microsoft Windows.

Tải bản đầy đủ ngay(0 tr)

×
x