首页 > 试题广场 >

下面哪些方式可以用于线程之间的同步?

[不定项选择题]
下面哪些方式可以用于线程之间的同步?
  • 临界区
  • 互斥区
  • 事件
  • 信号量
互斥量是内核对象,它与关键段(临界区)都有“线程所有权”所以不能用于线程的同步。
而事件和信号量是可以实现线程的同步的。
发表于 2016-08-07 12:44:04 回复(0)
在Win32中,临界区(Critical secion)和互斥量(mutex)是无法实现线程同步的,只能实现互斥。
在Win32中,只有事件(Event)和信号量(semaphore)能实现线程间的同步。
发表于 2016-06-17 21:23:29 回复(6)
临界区,信号量,互斥区,事件,进程同步。
发表于 2021-12-22 23:16:55 回复(0)
临界区[1]    指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个 线程 访问的特性。
怎么总觉得临界区应该不行呢?临界区是说一段程序代码啊。
http://baike.baidu.com/link?url=AyxpqGXm4IyLY6zPtrGMAB9nPcTFsLwvKunGpaafxbiQz-VZ08IDLeQviRCD7R748zNJv4JY9XMJXzhgs9h7ca
发表于 2015-08-29 20:39:11 回复(1)
原子变量、互斥(管程monitor)、锁、条件变量、信号量
发表于 2014-12-24 17:13:54 回复(1)

(1) 进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等

(2) 事件、临界区、互斥量、信号量可以实现线程同步

发表于 2015-07-27 12:58:26 回复(4)
进程中线程同步的四种常用方式:
  1、 临界区(CCriticalSection)
  当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。具体应用方式:
  1、 定义临界区对象CcriticalSection g_CriticalSection;
  2、 在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock();
  3、 访问共享资源后,则放弃临界区对象,g_CriticalSection.Unlock();
  
  2、 事件(CEvent)
  事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。每个Cevent对象可以有两种状态:有信号状态和无信号状态。Cevent类对象有两种类型:人工事件和自动事件。
  自动事件对象,在被至少一个线程释放后自动返回到无信号状态;
  人工事件对象,获得信号后,释放可利用线程,但直到调用成员函数ReSet()才将其设置为无信号状态。在创建Cevent对象时,默认创建的是自动事件。
  1、1234CEvent(BOOL bInitiallyOwn=FALSE,          BOOL bManualReset=FALSE,          LPCTSTR lpszName=NULL,          LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);

  bInitiallyOwn:指定事件对象初始化状态,TRUE为有信号,FALSE为无信号;
  bManualReset:指定要创建的事件是属于人工事件还是自动事件。TRUE为人工事件,FALSE为自动事件;
  后两个参数一般设为NULL,在此不作过多说明。
  2、BOOL CEvent::SetEvent();
  将Cevent类对象的状态设置为有信号状态。如果事件是人工事件,则Cevent类对象保持为有信号状态,直到调用成员函数ResetEvent()将其重新设为无信号状态时为止。如果为自动事件,则在SetEvent()后将事件设置为有信号状态,由系统自动重置为无信号状态。
  
  3、BOOL CEvent::ResetEvent();
  将事件的状态设置为无信号状态,并保持该状态直至SetEvent()被调用为止。由于自动事件是由系统自动重置,故自动事件不需要调用该函数。
  一般通过调用WaitForSingleObject()函数来监视事件状态。
  
  3、 互斥量(CMutex)
  互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,
  但是更节省资源,更有效率。
  4、 信号量(CSemphore)
  当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。CSemaphore类对象保存了对当前访问某一个指定资源的线程的计数值,该计数值是当前还可以使用该资源的线程数目。如果这个计数达到了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放入到一个队列中等待,直到超时或计数值不为零为止。

  
  CSemaphore(
  LONG lInitialCount = 1,
  LONG lMaxCount = 1,
  LPCTSTR pstrName = NULL,
  LPSECURITY_ATTRIBUTES lpsaAttributes = NULL
  );
  
  lInitialCount:信号量对象的初始计数值,即可访问线程数目的初始值;
  lMaxCount:信号量对象计数值的最大值,该参数决定了同一时刻可访问由信号量保护的资源的线程最大数目;
  后两个参数在同一进程中使用一般为NULL,不作过多讨论;
  一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就减1,只要当前可用资源计数大于0,就可以发出信号量信号。如果为0,则放入一个队列中等待。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源数加1。
发表于 2016-11-11 12:14:25 回复(3)
事件、临界区、互斥量、信号量实现线程同步
发表于 2015-08-24 22:21:19 回复(0)
事件怎么同步谁能教教我
发表于 2016-07-05 21:09:34 回复(0)
ab不是互斥吗?同步cd吧什么玩意
发表于 2023-10-22 10:24:13 回复(0)
我理解的同步就是协调各个线程之间的工作顺序,比如A完成了某项工作后B才能继续工作(好像408里是这么说的  所以我选了CD
然鹅一搜wikipedia
Thread synchronization is defined as a mechanism which ensures that two or more concurrent processes or threads do not simultaneously execute some particular program segment known as critical section. Processes' access to critical section is controlled by using synchronization techniques. When one thread starts executing the critical section (serialized segment of the program) the other thread should wait until the first thread finishes. If proper synchronization techniques[1] are not applied, it may cause a race condition where the values of variables may be unpredictable and vary depending on the timings of context switches of the processes or threads.

编辑于 2020-03-10 11:29:45 回复(0)
原来调用无参构造函数不能加括号
编辑于 2017-09-15 17:53:19 回复(0)
事件、临界区、互斥量、信号量实现线程同步
发表于 2017-04-18 10:32:12 回复(0)
事件、临界区、互斥量、信号量实现线程同步
发表于 2017-04-03 21:50:57 回复(0)
      事件、临界区、互斥量、信号量可以实现线程同步
发表于 2016-08-06 09:05:49 回复(0)

 事件、临界区、互斥量、信号量可以实现线程同步

发表于 2016-06-27 10:33:51 回复(0)
原子操作,信号量机制,自旋锁。
发表于 2014-11-15 08:54:46 回复(0)