线程教程Word文档格式.docx

上传人:b****1 文档编号:962278 上传时间:2023-04-29 格式:DOCX 页数:26 大小:23.37KB
下载 相关 举报
线程教程Word文档格式.docx_第1页
第1页 / 共26页
线程教程Word文档格式.docx_第2页
第2页 / 共26页
线程教程Word文档格式.docx_第3页
第3页 / 共26页
线程教程Word文档格式.docx_第4页
第4页 / 共26页
线程教程Word文档格式.docx_第5页
第5页 / 共26页
线程教程Word文档格式.docx_第6页
第6页 / 共26页
线程教程Word文档格式.docx_第7页
第7页 / 共26页
线程教程Word文档格式.docx_第8页
第8页 / 共26页
线程教程Word文档格式.docx_第9页
第9页 / 共26页
线程教程Word文档格式.docx_第10页
第10页 / 共26页
线程教程Word文档格式.docx_第11页
第11页 / 共26页
线程教程Word文档格式.docx_第12页
第12页 / 共26页
线程教程Word文档格式.docx_第13页
第13页 / 共26页
线程教程Word文档格式.docx_第14页
第14页 / 共26页
线程教程Word文档格式.docx_第15页
第15页 / 共26页
线程教程Word文档格式.docx_第16页
第16页 / 共26页
线程教程Word文档格式.docx_第17页
第17页 / 共26页
线程教程Word文档格式.docx_第18页
第18页 / 共26页
线程教程Word文档格式.docx_第19页
第19页 / 共26页
线程教程Word文档格式.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

线程教程Word文档格式.docx

《线程教程Word文档格式.docx》由会员分享,可在线阅读,更多相关《线程教程Word文档格式.docx(26页珍藏版)》请在冰点文库上搜索。

线程教程Word文档格式.docx

线程B

请求mutex1修改数据项1

请求mutex2修改数据项2

想要mutex2查看数据项2

想要mutex1查看数据项1

在上表中,就会发生死锁,因为线程A想要获取mutex2时被阻塞,而它正被线程B所持有;

线程B想要获取mutex1时被阻塞,而它正被线程A所持有。

与mutex类似,Unix中的条件变量,也是一种同步机制。

条件变量允许线程会合,可让一个线程在有变化时通知另一个线程,这在Windows中,被称为events。

操作系统的调用

下表列出的函数均可用于在CMutexClass、CEventClass、CTask及CThread类中实现线程。

2cm}P{margin-bottom:

函数

操作系统

描述

使用的类

CreateThread

Windows

创建一个Windows线程

CThread

pthread_create

UNIX-POSIXTHREADS

创建一个UNIX线程

pthread_join

等待一个UNIX线程结束

pthread_attr_init

将某一线程属性结构设为默认

pthread_attr_setstacksize

设置线程属性结构的堆栈大小

WaitForSingleObject

等待一个对象有信号

CThread,CMutexClass,CEventClass

CreateMutex

创建一个命名或未命名的mutex

CMutexClass

CloseHandle

关闭某一Windows句柄以释放资源

CMutexClass,CEventClass,CThread

ReleaseMutex

释放某一之前获取,并由WaitForSingleObject锁定的 

mutex

CMutexClass,CEventClass

pthread_mutexattr_init

初始化某一mutex属性结构

pthread_mutex_init

用给定的属性结构初始化某一mutex

pthread_mutex_lock

锁定某一mutex

pthread_mutex_unlock

解锁某一之前由pthread_mutex_lock锁定的mutex

pthread_mutex_destroy

释放分配给mutex的资源

CreateEvent

创建一个Windows事件对象

CEventClass

SetEvent

设置某一Windows事件对象为有信号状态

pthread_cond_signal

解除由pthread_cond_wait阻塞的某一线程

pthread_cond_wait

基于条件变量进行阻塞

pthread_cond_init

初始化一个条件变量

类CMutexClass

类CMutexClass封装了系统级的mutex函数及一个mutex同步对象,且提供了两个成员函数:

Lock及Unlock。

Lock成员函数锁定一个mutex并把它赋给一个调用线程,mutex一直保持锁定状态直到调用线程使用Unlock成员函数释放它。

任何调用Lock成员函数想获取锁定mutex的线程将被阻塞,并置于低CPU占用的等待状态,直到有线程释放了mutex。

CMutexClass:

:

CMutexClass(void):

m_bCreated(TRUE)

{

#ifdefWINDOWS

m_mutex=CreateMutex(NULL,FALSE,NULL);

if(!

m_mutex)m_bCreated=FALSE;

#else

pthread_mutexattr_tmattr;

pthread_mutexattr_init(&

mattr);

pthread_mutex_init(&

m_mutex,&

mattr);

#endif

memset(&

m_owner,0,sizeof(ThreadId_t));

}

~CMutexClass(void)

WaitForSingleObject(m_mutex,INFINITE);

CloseHandle(m_mutex);

pthread_mutex_lock(&

m_mutex);

pthread_mutex_unlock(&

pthread_mutex_destroy(&

/**

*

*Lock

*同一线程只能锁定同一mutex一次

**/

void

Lock()

ThreadId_tid=CThread:

ThreadId();

try{

if(CThread:

ThreadIdsEqual(&

m_owner,&

id))

//mutex已被这个线程锁定

throw"

/n/tthesamethreadcannotacquireamutextwice!

/n"

;

m_owner=CThread:

}

catch(char*psz)

{

MessageBoxA(NULL,&

psz[2],"

FatalexceptionCMutexClass:

Lock"

MB_ICONHAND);

exit(-1);

cerr<

"

Lock:

<

psz;

*Unlock

*只有获取该mutex的线程能释放它

Unlock()

try

CThread:

id,&

m_owner))

/n/tonlythethreadthatacquiresamutexcan

releaseit!

"

ReleaseMutex(m_mutex);

catch(char*psz)

Unlock"

Unlock:

voidCMutexClass()

构造函数

voidLock()

锁定mutex对象或当它阻塞时等待

voidUnlock()

解锁之前阻塞的mutex

intg_iStorage=0;

CMutexClassMyMutex;

voidStoreValue(int*pInt)

MyMutex.Lock();

//它可是“掌门人”喔,一个只允许一个线程。

g_iStorage=*pInt;

//受保护的数据,关键代码段。

MyMutex.Unlock();

//解锁,允许其他线程访问g_iStorage

类CEventClass

类CEventClass封装了Windows事件函数、Windows事件对象、Unix条件变量函数、Unix条件变量。

集成到CEventClass类中的函数分别为Windows下的SetEvent及CreateEvent,Unix下的htread_cond_init、pthread_cond_destroy、pthread_cond_signal、pthread_cond_wait。

在Unix下,为了简单起见,事件同步对象被称为条件变量,在此我们把条件变量及事件对象均称为事件对象。

#include"

Thread.h"

#include<

iostream>

usingnamespacestd;

CEventClass:

CEventClass(void):

m_event=CreateEvent(NULL,FALSE,FALSE,NULL);

m_event)

m_bCreated=FALSE;

pthread_mutexattr_init(&

m_lock,&

pthread_cond_init(&

m_ready,NULL);

~CEventClass(void)

CloseHandle(m_event);

pthread_cond_destroy(&

m_ready);

m_lock);

*Set

*设置某一事件为有信号状态

Set()

SetEvent(m_event);

pthread_cond_signal(&

*Wait

*等待一个事件对象为有信号状态,必须在同一线程中与Reset调用成对使用。

BOOL

Wait()

if(CThread:

/n/tinvalidWaitcall,Waitcannotbecalledmore

thanonce"

/n/twithoutacorrespondingcalltoReset!

ThreadId_tzero;

zero,0,sizeof(ThreadId_t));

if(memcmp(&

zero,&

m_owner,sizeof(ThreadId_t))!

=0)

/n/tanotherthreadisalreadywaitingonthisevent!

if(WaitForSingleObject(m_event,INFINITE)!

=WAIT_OBJECT_0)

returnFALSE;

pthread_cond_wait(&

m_ready,&

returnTRUE;

FatalexceptionCEventClass:

Wait"

Wait:

*Reset

*复位一个事件标志为无信号状态,必须在同一线程中与前面的Wait成对使用。

Reset()

CThread:

/n/tunbalancedcalltoReset,Resetmustbecalled

from/n"

/n/tthesameWait-Resetpair!

#ifndefWINDOWS

Reset"

Reset:

voidSet()

设置一个事件状态为有信号,通知阻塞的线程。

BOOLWait()

把调用线程置于阻塞状态,直到事件状态为有信号。

成功返回TRUE,否则返回FALSE。

voidReset()

把一个有信号事件重置为无信号状态。

接收信号的线程使用事件对象的例子:

CEventClassevent;

.

//线程代码

while(bContinueRunning)

event.Wait();

//等待事件发生

//执行某些任务

event.Reset();

//重置事件为无信号状态

向另一线程发信号时使用事件对象的例子:

//改动了一些数据

event.Set();

//通知线程一个事件已发生,设置事件为有信号状态。

CTask类及非特定的线程

在许多线程编程的示例中,线程处理的数据一般都放在由mutex保护的全局变量中,操纵数据的指令也在集成进线程函数中,我们把这种形式的的线程称为特定异步线程(SAT);

理想上来说,数据及对应的处理数据的功能,都应封装进同一对象,我们把这种形式的线程称为同种异步线程(HAT)。

在HAT模式下,线程不是特定的,举例来说,HAT中就没有打印线程及I/O线程,取而代之的是,单一线程能执行这两种任务,因为任务是彻底作为对象来实现的,那就是说,它们包含了数据及必要的功能。

CTask类就是一个采用HAT线程模式的基类。

typedefenum{

TaskStatusNotSubmitted,

TaskStatusWaitingOnQueue,

TaskStatusBeingProcessed,

TaskStatusCompleted}TaskStatus_t;

classCTask

private:

CMutexClassm_mutex;

TaskStatus_tm_state;

ThreadId_tm_dwThread;

public:

voidSetTaskStatus(TaskStatus_tstate)

m_mutex.Lock();

m_state=state;

m_mutex.Unlock();

voidSetId(ThreadId_t*pid)

memcpy(&

m_dwThread,pid,sizeof(ThreadId_t));

/**

*

*Wait

*等待任务完成,或timeoutSeconds秒

**/

BOOLWait(inttimeoutSeconds)

timeoutSeconds=timeoutSeconds*1000;

if(Status()!

=TaskStatusCompleted&

&

timeoutSeconds>

0)

Sleep(100);

timeoutSeconds=timeoutSeconds-100;

if(Status()==Tas

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2