BCB线程的互斥与同步
2007-10-08 17:18
281 查看
线程的互斥与同步
互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突。实现线程互斥的方法有:
(1) 访问代码委托给VCL主线程执行。在线程中若要调用可视化的方法或访问其属性,可将执行代码委托给VCL主线程执行,否则会发生并发访问冲突。委托的方法是先将使用可视化组件的代码单独编成一个函数,函数原型是void 函数名(void),然后电泳TThread类的成员函数Synchronize(函数名)来调用它,VCL主线程顺序执行所有组建对该组建的访问(包括响应人机界面事件、windows系统事件等),从而不会发生冲突。
(2) 使用对象锁。有些VCL类提供对象锁,可以使用对象的LOCK与UNLOCK方法进行加锁与解锁。当访问这些对象时,可调用LOCK方法锁住对象,然后访问该对象,访问完毕后调用对象的UNLOCK方法释放该对象。
(3) 使用临界区对象。若要访问一个全局变量,则可设置一个临界区对象(TCritical Section)来实现互斥,该对象有Acquire与Release两个方法。Acquire方法阻塞其他线程,执行临界区代码,而Release方法释放等待进入临界区的线程。例如:设Q为全局变量,Crit1为临界区对象,在访问Q进入临界区时须执行Crit1.Acquire(),访问后退出临界区时须执行Crit1.Release()。
互斥控制是为了避免一个线程在使用某一个对象或全局变量与其他线程发生冲突。实现线程互斥的方法有:
(1) 访问代码委托给VCL主线程执行。在线程中若要调用可视化的方法或访问其属性,可将执行代码委托给VCL主线程执行,否则会发生并发访问冲突。委托的方法是先将使用可视化组件的代码单独编成一个函数,函数原型是void 函数名(void),然后电泳TThread类的成员函数Synchronize(函数名)来调用它,VCL主线程顺序执行所有组建对该组建的访问(包括响应人机界面事件、windows系统事件等),从而不会发生冲突。
(2) 使用对象锁。有些VCL类提供对象锁,可以使用对象的LOCK与UNLOCK方法进行加锁与解锁。当访问这些对象时,可调用LOCK方法锁住对象,然后访问该对象,访问完毕后调用对象的UNLOCK方法释放该对象。
(3) 使用临界区对象。若要访问一个全局变量,则可设置一个临界区对象(TCritical Section)来实现互斥,该对象有Acquire与Release两个方法。Acquire方法阻塞其他线程,执行临界区代码,而Release方法释放等待进入临界区的线程。例如:设Q为全局变量,Crit1为临界区对象,在访问Q进入临界区时须执行Crit1.Acquire(),访问后退出临界区时须执行Crit1.Release()。
相关文章推荐
- BCB线程的互斥与同步
- BCB线程的互斥与同步
- 线程的同步与互斥:条件变量&信号量
- 线程的同步与互斥---生产者消费者模型
- 线程的同步与互斥
- 用互斥线程进行同步
- 张孝祥[致敬]-多线程学习第03课-线程的互斥与同步
- 利用线程的同步和互斥解决两个消费者两个生产者一个临界区问题
- java 线程(三) 互斥和同步
- java并发包中的Condition和Lock 取代Synchronized、wait、notify/notifyAll实现线程的同步与互斥
- java线程的同步互斥和通讯
- Linux--线程的同步与互斥
- 讲Linux下面线程的操作、多线程的同步和互斥相关函数及操作的文章链接
- 线程间同步与互斥:生产者消费者问题
- 线程间的同步和互斥
- 【操作系统】进程(线程)间同步互斥问题——熟睡的理发师问题
- linux中线程的同步和互斥
- Python线程间的同步与互斥
- 进程与线程的同步与互斥
- 线程面试题之三:父子线程和子线程之间的同步与互斥