新手学C++多线程编程(10)类行为和线程处理
来源:互联网 发布:广数螺纹编程格式 编辑:程序博客网 时间:2024/05/22 07:25
C++多线程编程(10)类行为和线程处理
C++多线程编程(10)
1.C++对象4种作用域类型:局部作用域、函数作用域、文件作用域、类作用域
程序分成多个进程,每个进程有自己的文本、数据和堆栈片段。每个程序有自己的堆。为了让进城访问另
一个进程的数据或命令,必须进行进程间通信。进程间通信位于每个进程外部,并且充当进程间数据流的
通道。
局部:只能在声明它所在块内部使用的名字,活声明点后所包含的块内使用。函数的形参名字具有此函数
最外部块的作用域
函数:只具有函数作用域的标签。
文件:只在块和类外部声明的文件作用域名字。具有文件作用域的名字为全局性的。
类:只能用于在此类的成员函数中,类的某对象用于(.)运算符之后,用于指向它的类或派生类的某对象
指针(->)运算符之后或应用于它的类或派生类作用域分辨率运算符(::)之后。在友元函数中声明的名字首
先属于全局作用域。对于在返回值或参数类型中声明的名字类也是如此。
2.程序每个源文件称一个翻译单元,在一个翻译单元中具有文件作用域的对象可以具有内部链接或外部连
接。内部连接只能再声明它的翻译单元中访问它,外部连接可以被其他翻译单元中的函数和对象访问。
线程需要参数来访问对象的条件,和线程可以通过参数自由访问对象的条件:
文件: 外部连接 无必须参数,内部连接 作为参数传递
局部:外部连接 无参数,内部连接作为参数传递
类:外部连接 无参数,内部连接作为参数传递
函数:外部连接 无参数,内部连接作为参数传递
值传递对象 可以从进程内的任一个线程单向访问任何一个对象,接收线程只能读取对象不能修改它。
引用或指针传递 则对象充当线程间的通信连接,且双向通信。
3.线程和类作用域: 如果声明对象具有文件作用域和外部连接,则线程可以访问对象的所有公有成员函
数,不必借助其他特殊手段;如果声明对象具有文件作用域和内部连接,而且线程执行的函数与对象位于
相同的翻译单元,则线程可以访问对象,也不必借助其他特殊手段。在其他任何场合,必须在包含原始对
象的线程和对象成员函数创建线程间进行参数传递。一旦创建了线程,对象访问就由对象作用域和连接所
控制。
4.4种基本同步关系:SS、FS、SF、FF
斥量来防止线程破坏对象临界区。
。同步化对象的线程将使用条件变量、等待函数或事件互斥量的线程间机制。
这些机制是对象的一部分,通过继承或复合包含在对象中。每个对象都必须包含它的同步机制。
5.使用6个基本组件实现计算器服务器:宿主类、线程类、互斥量和事件类、友元成员函数、域类、强制
转换基本元素。
class threaded_calculator:private mutex{
};
double threaded_calculator::evaluate(String Input)
{
}
6.多线程环境中构建和析构对象:
调用析构函数。如果析构函数中存在锁定或释放机制,则调用exit()常会让挂起的析构函数执行。
些析构函数包含对一些当前占有互斥量的取消锁定或释放机制,则应用程序将退出并保持对互斥量的占有
权,其他所有等待该互斥量的进程或线程可能被无限延迟。
在多线程环境中强烈推荐使用C++异常处理机制,程序失败或抛出异常时,结构化异常处理让程序员有机
会决定通过同步机制如何应付。
异步执行时,并不能确保单个进程中的多个线程将采取并发或同时执行。
7. 构造函数和SS关系:直到构建另一个对象后,该对象才能被构建。如果对象间处于分离线程中,那么
需要使用条件变量(广播)或事件互斥量来管理对象间的SS关系。
一旦构建同步后,两个对象之间立即开始某种行为,确保每个对象包含自己的事件互斥量来管理诸如
SF\FS\SS关系的对象。
void event_mutex::postEvent(void)
{ DosPostEventSem(EventMutex);
}
void event_mutex::waitEvent(void) //消费者的构造函数使用等待事件信号
{ DosWaitEventSem(EventMutex,EventWait);
}
8.析构函数和FF关系:
取消线程: pthread_cancel(ThreadId);//POSIX 、TerminateThread(ThreadId,ExitCode);//Win 32、
DosKillThread(ThreadId); //OS/2
有时线程取消不可避免,由于某些原因,一个线程被锁定,而且不能对任何通信尝试做出反应,这样的线
程必须取消。陷入致命或无限循环的线程必须取消。不过,在大部分清空下,应当使用条件变量和事件互
斥量来控制其活动部再需要的线程。
防止杂乱线程取消的第一步:在某个对象中封装线程句柄。第二步:使用C++异常处理机制try...catch{}
和throw{}块结构来支持异常处理。
#include<pthread.h>
typedef void *(*FunctionPtr)(void*);
class ct_thread{
线程的ThreadId,因为ThreadId由ct_thread类控制。
};
9.使用C++异常处理机制:
a.调用堆栈和线程—— 允许异常沿着函数的调用链向上传播直到找到捕获该异常的处理器为止:
funcB()
funcC()
funcD()
{
}
注意:每个线程应当负责自己的异常处理,在设计异常处理逻辑时,请单独考虑每个线程的调用堆栈。不要试图从一个线程到另一个线程抛出异常,因为进程中的每个线程都有属于自己的调用堆栈。
b.通过异常处理返回多种类型:允许函数返回不同的类型。
c.可靠线程化架构:
10.线程安全函数:
如果函数是不可重复进入(代码块不能在使用时更改),或访问未保护全局变量,或者包含静态可修改变量,则函数就是非线程安全的。反之则为线程安全函数或可重复进入的函数。
11.多线程环境中的不安全函数:
12.通过复合结合容器类与接口类,使用成员函数封装STL算法:
- 新手学C++多线程编程(10)类行为和线程处理
- 新手学C++多线程编程(3)线程
- 新手学C++多线程编程(5)进程间和线程间通信
- 类行为和线程处理
- 新手学C++多线程编程(9)多线程面向对象架构和类层次C++组件
- 新手学C++多线程编程(2)进程
- 新手学JAVA(十)-多线程----线程的创建和启动
- 新手学C++多线程编程(11)测试多线程应用程序
- 新手学JAVA(十一)-多线程----线程的生命周期
- 新手学C++多线程编程(7)接口类与进程间通信
- 新手学C++多线程编程(1)组件
- 新手学C++多线程编程(6)合作与同步
- 新手学C++多线程编程(8)同步对象
- c#.net多线程教学(4):线程池和异步编程
- C#.NET多线程教学(4):线程池和异步编程
- C语言多线程编程-进程和线程的基本概念
- 新手学C++多线程编程(4)多任务与多线程编程
- C#.net多线程编程教学(1): 线程同步多任务和多线程
- HDU 5527----Too Rich
- Shiro
- 流媒体相关 标准文档对应 整理
- 问答机器人
- 记忆的窍门
- 新手学C++多线程编程(10)类行为和线程处理
- zigbee协议栈z-satack解读。
- [微信小程序]鼠标事件
- Js中非构造函数的继承(深拷贝浅拷贝)
- 介绍 redis-Bit-Map 的相关命令和常用场景
- Codeforces835D-Palindromic characteristics(DP)
- MongoDB 聚合操作
- imx6 Linux Kernl添加spidev的设备节点
- maven 配置windows环境变量