子線程循環 10 次,接着主線程循環 100 次,接着又回到子線程循環10 次(線程面試:windows下實現)

瀏覽MoreWindows的文章寫出來的
http://blog.csdn.net/morewindows/article/details/7392749
 
 
#include <stdio.h>   
#include <process.h>   
#include <windows.h>   

unsigned int __stdcall Fun(void *pPM);  
const int THREAD_NUM = 1;  

//循環次數
const int LOOP = 6;

//兩個互斥事件
HANDLE g_hThreadEvent1;
HANDLE g_hThreadEvent2;
 
int main()
{
	printf("\t子線程循環 10 次,接着主線程循環 100 次,接着又回到子線程循環10 次,\n接着再回到主線程又循環 100 次,如此循環50次\n");

	int i = 0 , j;
	HANDLE hdl[THREAD_NUM];

	g_hThreadEvent1 = CreateEvent(NULL,FALSE,FALSE,NULL);
 	g_hThreadEvent2 = CreateEvent(NULL,FALSE,TRUE,NULL);


	hdl[0] = (HANDLE)_beginthreadex(NULL,0,Fun,NULL,0,NULL);



	for( i = 0 ; i < LOOP; i++)
	{
		WaitForSingleObject(g_hThreadEvent1,INFINITE);
		
		for(j = 0 ; j<4; j++)
		{
			printf(" 主要線程編號是 ,在循環第 %d 次\n",j+1);	 
		}
		SetEvent(g_hThreadEvent2);
		Sleep(200);

	}
	
	CloseHandle(g_hThreadEvent2);  
	CloseHandle(g_hThreadEvent1); 

	for (i = 0; i < THREAD_NUM; i++)  
		CloseHandle(hdl[i]);  

	return 0;
}

unsigned int __stdcall Fun(void *pPM)
{
	int num = 0;
	int i = 0;

	for( i  = 0 ; i< LOOP;i++)
	{
		WaitForSingleObject(g_hThreadEvent2,INFINITE);

		 for(num = 0;num < 2 ; num++)
		 {
			 printf("  線程編號是 %d ,在循環第 %d 次\n",GetCurrentThreadId(),num+1);	 
		 }
		
		 SetEvent(g_hThreadEvent1);
	}
	return 0;
}


 

第二題:我覺得有彙編基礎的人應該能很快知道答案是50 -100

 

一個全局變量tally,兩個線程併發執行(代碼段都是ThreadProc),問兩個線程都結束後,tally取值範圍。

inttally = 0;//glable

voidThreadProc()

{

       for(inti = 1; i <= 50; i++)

              tally += 1;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章