|
|
发表于 2007-6-3 20:39:00
|
显示全部楼层
Re:如何新建线程
这个是我当时学操作系统里面关于线程的代码
著名的读者写者问题的实现,里面有两个线程函数的定义和使用
希望有所帮助
:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__A7490AF0_1731_4B9E_A713_88E0EB7AD429__INCLUDED_)
#define AFX_STDAFX_H__A7490AF0_1731_4B9E_A713_88E0EB7AD429__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
struct thread_info
{
int id;
char role;
float delay;
int persist;
};
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__A7490AF0_1731_4B9E_A713_88E0EB7AD429__INCLUDED_)
-----------------------------------------------------------------------------
// ReaderAndWriter.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <fstream.h>
#include <iostream.h>
#define UserNum_Max 100
typedef HANDLE semaphore;
semaphore mutex;
semaphore mutex1;
semaphore mutex2;
semaphore mutex3;
semaphore r_w_w;
semaphore cs_Read;
semaphore cs_Write;
int readCount=0;
int writeCount=0;
thread_info User[UserNum_Max];
DWORD WINAPI reader_RF(LPVOID lpParam)
{
thread_info Param=*((thread_info *)lpParam);
::Sleep((int)(Param.delay*1000));
cout<< aram.id<<"is sending a reading require\n";
::WaitForSingleObject(mutex,INFINITE);//P操作
readCount++;
if(readCount==1)
{
::WaitForSingleObject(r_w_w,INFINITE);
}
::ReleaseSemaphore(mutex,1,NULL);//V操作
cout<<Param.id<<"begins reading.."<<endl;
::Sleep(Param.persist*1000);
cout<<Param.id<<"finish reading"<<endl;
::WaitForSingleObject(mutex,INFINITE);
readCount--;
if(readCount==0)
{
::ReleaseSemaphore(r_w_w,1,NULL);
}
::ReleaseSemaphore(mutex,1,NULL);
return 0;
}
DWORD WINAPI writer_RF(LPVOID lpParam)
{
thread_info Param=*((thread_info *)lpParam);
::Sleep((int)(Param.delay*1000));
cout<<Param.id<<"is sending a write require"<<endl;
::WaitForSingleObject(r_w_w,INFINITE);
cout<<Param.id<<"begins writing.."<<endl;
::Sleep(Param.persist*1000);
cout<<Param.id<<"finish writing.."<<endl;
::ReleaseSemaphore(r_w_w,1,NULL);
return 0;
}
DWORD WINAPI reader_WF(LPVOID lpParam)
{
thread_info Param=*((thread_info *)lpParam);
::Sleep((int)(Param.delay*1000));
cout<<Param.id<<" is sending a reading require\n";
::WaitForSingleObject(mutex1,INFINITE);
::WaitForSingleObject(cs_Read,INFINITE);
::WaitForSingleObject(mutex2,INFINITE);
readCount++;
if(readCount==1)
{
::WaitForSingleObject(cs_Write,INFINITE);
}
::ReleaseSemaphore(mutex2,1,NULL);
::ReleaseSemaphore(cs_Read,1,NULL);
::ReleaseSemaphore(mutex1,1,NULL);
cout<<Param.id<<"begins reading.."<<endl;
::Sleep(Param.persist*1000);
cout<<Param.id<<"finish reading"<<endl;
::WaitForSingleObject(mutex2,INFINITE);
readCount--;
if(readCount==0)
{
::ReleaseSemaphore(cs_Write,1,NULL);
}
::ReleaseSemaphore(mutex2,1,NULL);
return 0;
}
DWORD WINAPI writer_WF(LPVOID lpParam)
{
thread_info Param=*((thread_info *)lpParam);
::Sleep((int)(Param.delay*1000));
cout<<Param.id<<" is sending a write require"<<endl;
::WaitForSingleObject(mutex3,INFINITE);
writeCount++;
if(writeCount==1)
{
::WaitForSingleObject(cs_Read,INFINITE);
}
::ReleaseSemaphore(mutex3,1,NULL);
::WaitForSingleObject(cs_Write,INFINITE);
cout<<Param.id<<"begins writing.."<<endl;
::Sleep(Param.persist*1000);
cout<<Param.id<<"finish writing.."<<endl;
::ReleaseSemaphore(cs_Write,1,NULL);
::WaitForSingleObject(mutex3,INFINITE);
writeCount--;
if(writeCount==0)
{
::ReleaseSemaphore(cs_Read,1,NULL);
}
::ReleaseSemaphore(mutex3,1,NULL);
return 0;
}
int main(int argc, char* argv[])
{
DWORD dwThreadId[UserNum_Max];
int UserNum=0;
int temp;
HANDLE h[UserNum_Max];
ifstream in("Users.dat");
int mode;
printf("*************************************\n");
printf("* 1.读者优先 *\n");
printf("* 2.写者优先 *\n");
printf("* 3.退出 *\n");
printf("*************************************\n");
printf("Please enter your choice:\n");
mutex=::CreateSemaphore(NULL,1,1,NULL);
mutex1=::CreateSemaphore(NULL,1,1,NULL);
mutex2=::CreateSemaphore(NULL,1,1,NULL);
mutex3=::CreateSemaphore(NULL,1,1,NULL);
cs_Read=::CreateSemaphore(NULL,1,1,NULL);
cs_Write=::CreateSemaphore(NULL,1,1,NULL);
r_w_w=::CreateSemaphore(NULL,1,1,"reader_RF");
cin>>mode;
while(in>>temp&&(mode==1||mode==2))
{
User[UserNum].id=temp;
in>>User[UserNum].role;
in>>User[UserNum].delay;
in>>User[UserNum].persist;
// cout<<User[UserNum].id;
// cout<<User[UserNum].role;
// cout<<User[UserNum].delay;
// cout<<User[UserNum].persist;
if(mode==1)
{
if(User[UserNum].role=='R')
{
h[UserNum]=::CreateThread(NULL,NULL,reader_RF,&User[UserNum],0,&dwThreadId[UserNum]);
}
else if(User[UserNum].role=='W')
{
{
h[UserNum]=::CreateThread(NULL,NULL,writer_RF,&User[UserNum],0,&dwThreadId[UserNum]);
}
}
}
else if(mode==2)
{
if(User[UserNum].role=='R')
{
h[UserNum]=::CreateThread(NULL,NULL,reader_WF,&User[UserNum],0,&dwThreadId[UserNum]);
}
else if(User[UserNum].role=='W')
{
{
h[UserNum]=::CreateThread(NULL,NULL,writer_WF,&User[UserNum],0,&dwThreadId[UserNum]);
}
}
}
UserNum++;
}
if(mode==3) cout<<"Goodbye!"<<endl;
::WaitForMultipleObjects(UserNum,h,TRUE,INFINITE);
return 0;
} |
|