欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++中四种进程或线程同步互斥的控制方法

程序员文章站 2022-10-30 19:18:54
现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.net和java下灵活多变的,简便的线程进程控制手段。     这4...

  1. 现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.net和java下灵活多变的,简便的线程进程控制手段。  
  2.   这4种方法具体定义如下 在《操作教程》isbn 7-5053-6193-7 一书中能够找到更加周详的解释  
  3.   
  4.   1临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。  
  5.   
  6.   2互斥量:为协调一起对一个共享资源的单独访问而设计的。  
  7.   
  8.   3信号量:为控制一个具备有限数量用户资源而设计。  
  9.   
  10.   4事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。  
  11.   
  12.   临界区(critical section)  
  13.   
  14.   确保在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。假如有多个线程试图同时访问临界区,那么在有一个线程进入后其他任何试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程能够继续抢占,并以此达到用原子方式操作共享资源的目的。  
  15.   
  16.   临界区包含两个操作原语: entercriticalsection() 进入临界区 leavecriticalsection() 离开临界区  
  17.   
  18.   entercriticalsection()语句执行后代码将进入临界区以后无论发生什么,必须确保和之匹配的leavecriticalsection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。  
  19.   
  20.   mfc提供了很多功能完备的类,我用mfc实现了临界区。mfc为临界区提供有一个ccriticalsection类,使用该类进行线程同步处理是很简单的。只需在线程函数中用ccriticalsection类成员函数lock()和unlock()标定出被保护代码片段即可。lock()后代码用到的资源自动被视为临界区内的资源被保护。unlock后别的线程才能访问这些资源。  
  21.   
  22. 代码:   
  23. //criticalsection   
  24. ccriticalsection global_criticalsection;   
  25.   
  26. // 共享资源   
  27. char global_array[256];   
  28.   
  29. //初始化共享资源   
  30. void initializearray()   
  31. {   
  32. for(int i = 0;i<256;i )   
  33. {   
  34. global_array[i]=i;   
  35. }   
  36. }   
  37.   
  38. //写线程   
  39. uint global_threadwrite(lpvoid pparam)   
  40. {   
  41. cedit *ptr=(cedit *)pparam;   
  42. ptr->setwindowtext("");   
  43. //进入临界区   
  44. global_criticalsection.lock();   
  45. for(int i = 0;i<256;i )   
  46. {   
  47. global_array[i]=w;   
  48. ptr->setwindowtext(global_array);   
  49. sleep(10);   
  50. }  
  51.   
  52.  //离开临界区   
  53. global_criticalsection.unlock();   
  54. return 0;   
  55. }   
  56.   
  57. //删除线程   
  58. uint global_threaddelete(lpvoid pparam)   
  59. {   
  60. cedit *ptr=(cedit *)pparam;   
  61. ptr->setwindowtext("");   
  62. //进入临界区   
  63. global_criticalsection.lock();   
  64. for(int i = 0;i<256;i )   
  65. {   
  66. global_array[i]=d;   
  67. ptr->setwindowtext(global_array);   
  68. sleep(10);   
  69. }   
  70.   
  71.  //离开临界区   
  72. global_criticalsection.unlock();   
  73. return 0;   
  74. }   
  75.   
  76. //创建线程并启动线程