多线程同步机制的几种方法

Critical Section
Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程
的各线程之间。它是:
 一个局部性对象,不是一个核心对象。
 快速而有效率。
 不能够同时有一个以上的 critical section 被等待。
 无法侦测是否已被某个线程放弃。

可以实现线程间互斥,不能用来实现同步。

Semaphore
Semaphore 被用来追踪有限的资源。它是:
一个核心对象。

没有拥有者。

可以具名,因此可以被其他进程开启。
 可以被任何一个线程释放(released)。

既能实现线程间互斥,也能实现线程间同步。

在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程不会收到通知。

Mutex
Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚
至即使那些线程分属不同进程。它是:
一个核心对象。
 如果拥有 mutex 的那个线程结束,则会产生一个 “abandoned” 错
误信息。
i可以具名,因此可以被其他进程开启。
只能被拥有它的那个线程释放(released)。

在跨进程中使用时,如果拥有互斥器的进程意外结束,其它进程会收到一个WAIT_ABANDOEND消息。

Event 
Event object 通常使用于 overlapped I/O,或用来设计某些自定
义的同步对象。它是:
 一个核心对象。
可是用来实现线程的互斥与同步。
可以具名,因此可以被其他进程开启。

在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程也不会受到通知。

注意:临界区和互斥器都有“线程所有权”的概念,所以它们是不能用来实现线程间的同步的,只能用来实现互斥。原因是由于创建临界区或互斥器的线程可以不用等待LeaveCriticalSection(),SetEvent()就可以无条件进入保护的程序段,因为它拥有这个权利。另外,互斥器可以很好的处理”遗弃“操作。若线程在未释放对向象的时候就意外终止的,其它线程可以等待到一个WAIT_ABANDONED_0。但是事件和信号量都不能做到。

事件和信号量都可以实现线程和进程间的互斥和同步。

就使用效率来说,临界区的效率是最高的,因为它不是内核对象,而其它的三个都是核心对象,要借助操作系统来实现,效率相对来说就比较低。

但如果要跨进程使用还是要用到互斥器、事件对象和信号量。

总之:在设计时,首先尽量不要使用全局变量,如果不得以先然后考虑使用Inter...()函数,然后在是临界区对象,最后才是事件、互斥器、信号量。

时间: 2024-08-29 08:17:12

多线程同步机制的几种方法的相关文章

Java多线程同步机制

Java的多线程同步机制和其他语言开发的是一样的,在当前线程中,遇到某个事件时,等待另一个线程运行结束或者另一个线程的事件,然后再决定如何处理. 本例来自书上的实例,精简了代码,调整了部分逻辑,使得看起来更加简洁明了.已经运行通过. 代码如下: package SwingExample; import java.awt.BorderLayout; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPro

linux-CentOS6.4安装Memcached+memcached扩展+安装memcache扩展+Memcache同步SESSION的几种方法

一.编译环境的准备 yum install gcc  yum install gcc-c++ libstdc++-devel  yum install zlib-devel 二.源码包准备 wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gzwget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz 三.安装与配置 1.安装libevent tar zx

Linux多线程同步机制

http://blog.163.com/he_junwei/blog/static/19793764620141711130253/ http://blog.csdn.net/h_armony/article/details/6766505  一.互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的mutex函数. 1. 创建和销毁 有两种方法创建互斥

多进程间通信方式和多线程同步机制总结

多进程之间通信方式: 文件映射:本地之间 共享内存:本地之间 匿名管道:本地之间 命名管道:跨服务器 邮件槽:一对多的传输数据,通常通过网络向一台Windows机器传输 剪切板:本地之间 socket:跨服务器 多线程之间通信方式: 全局变量 自定义消息响应 多线程之间同步机制:           临界区:不可以跨进程,忘记解锁会无限等待,要么存在要么没有,多线程访问独占性共享资源 互斥量:可以跨进程,忘记解锁会自动释放,要么存在要么没有 事件:又叫线程触发器,不可以跨进程,要么存在要么没有,

Linux 多线程同步机制:互斥量、信号量、条件变量

互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t主要涉及函数:pthread_mutex_lock() pthread_mutex_trylock() pthread_mutex_unlock()Pthreaf_mutex_init() pthread_mutex_destroy()lock与unlock之间所锁定的区域为临界区域(如果只加锁不解锁程序会阻塞等待)信号量:信号

Java中线程等待(同步)的五种方法

在面试时,经常会有面试官问道,一个主线程有多个子线程,如何能使子线程的业务执行完成之后,再执行主线程业务逻辑.对于这个问题,本人能够想到的有五种方法,详细请移步源码 1.使用线程类自带的join方法,将子线程加入到主线程,在子线程执行完之后,在执行主线程逻辑. 例如 public static void joinDemo() throws InterruptedException { System.out.println("=========Test with join=====");

python多线程同步机制Semaphore

#!/usr/bin/env python # -*- coding: utf-8 -*- """ Python 线程同步机制:Semaphore """ import time import threading import random # 信号量同步基于内部计数器,每调用一次acquire(),计数器减1:每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞. sema = threading.Semaph

CentOS集群自动同步时间的一种方法

之前有篇日志是手动同步时间的 http://www.ahlinux.com/os/201304/202456.html 之所以这么干,是因为我们实验室的局域网只有一部分IP可以访问外网,服务器所用的IP恰好上不了外网,没法从互联网上同步时间,只好在本地设一台ntp服务器,从这一台机器同步时间了. 可是昨晚上实验室停电,今天早上开机之后发现服务器的时间差了不少(那几台作为服务器的台式机都5.6年了,估计是CMOS电池不行了). 手动一台台地同步时间(执行ntpdate xxx)实在很麻烦. 于是尝

PHP 中Session 反序列化机制的三种方法

?php.ini中存在三项配置项: session.save_path="" --设置session的存储路径 session.save_handler=""--设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式) session.auto_start boolen--指定会话模块是否在请求开始时启动一个会话默认为0不启动 session.serialize_handler string--定义用来序列化/反序列化的处理器名字