中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一、(LINUX 線程同步) 引入

發布時間:2020-08-09 03:49:36 來源:ITPUB博客 閱讀:126 作者:gaopengtttt 欄目:建站服務器
原創水平有限有誤請指出

線程相比進程有著先天的數據共享的優勢,如下圖,線程共享了進程除棧區以外的所有內存區域如下圖所示:
一、(LINUX 線程同步) 引入

但是這種共享有時候也會帶來問題,簡單的考慮如下C++代碼:

點擊(此處)折疊或打開

  1. {
  2.                         int b = 0;
  3.                         b = a;
  4.                         a = b+1;
  5.                         return *this;
  6.                 }


就是臨界區代碼
后面將對他們進行描述,這里我們簡單實用靜態互斥鎖進行解決這個問題。

點擊(此處)折疊或打開

  1. //原子操作 加鎖
  2.                 pthread_mutex_lock(&mtx);
  3.                 ++test;
  4.                 pthread_mutex_unlock(&mtx);
  5.                 //原子操作 解鎖
  6.                 cout<<pthread_self() <<":";
  7.                 test.prit()
實際上我們就是保護了操作符重載的testc& operator++()
臨界區的選擇應該盡量小,避免對多線程的并發性產生較大的性能影響


具體代碼如下:

點擊(此處)折疊或打開

  1. /*************************************************************************
  2.   > File Name: error.cpp
  3.   > Author: gaopeng QQ:22389860 all right reserved
  4.   > Mail: gaopp_200217@163.com
  5.   > Created Time: Mon 15 May 2017 12:01:33 AM CST
  6.  ************************************************************************/

  7. #include<iostream>
  8. #include <pthread.h>
  9. #include <string.h>
  10. #define MAXOUT 1000000
  11. using namespace std;

  12. static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;


  13. class testc
  14. {
  15.         private:
  16.                 int a;
  17.         public:
  18.                 testc()
  19.                 {
  20.                         a = 1;
  21.                 }
  22.                 testc& operator++()
  23.                 {
  24.                         int b = 0;
  25.                         b = a;
  26.                         a = b+1;
  27.                         return *this;

  28.                 }
  29.                 void prit()
  30.                 {
  31.                         cout<<a<<endl;
  32.                 }
  33. };


  34. testc test = test;


  35. void* testp(void* arg)
  36. {
  37.         int i = MAXOUT;

  38.         while(i--)
  39.         {
  40.                 //原子操作 加鎖
  41.                 pthread_mutex_lock(&mtx);
  42.                 ++test;
  43.                 pthread_mutex_unlock(&mtx);
  44.                 //原子操作 解鎖
  45.                 cout<<pthread_self() <<":";
  46.                 test.prit();
  47.         }
  48. }




  49. int main(void)
  50. {
  51.         pthread_t tid[3];
  52.         int er;
  53.         int i = 0;

  54.         while(i<3)
  55.         {

  56.                 if ((er = pthread_create(tid+i,NULL,testp,NULL) )!=0 )
  57.                 {
  58.                         strerror(er);
  59.                         return -1;
  60.                 }
  61.                 i++;
  62.         }

  63.         i = 0;

  64.         while(i<3)
  65.         {
  66.                 pthread_join(*(tid+i),NULL);
  67.                 i++;
  68.         }
  69.         cout<<"last numer: ";
  70.         test.prit();
  71. }


注意:一個簡單類型的i++也不一定是一個原子操作,所以在涉及到并發修改共享變量的時候一定要使用
線程同步手段。



作者微信:

               一、(LINUX 線程同步) 引入
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昭通市| 三河市| 柳河县| 施秉县| 阜新市| 辽宁省| 睢宁县| 南江县| 广饶县| 贵州省| 齐齐哈尔市| 靖远县| 和硕县| 尼玛县| 丹凤县| 马龙县| 宁城县| 靖远县| 玉树县| 望奎县| 酉阳| 云浮市| 洛隆县| 常德市| 潼关县| 渝中区| 嘉峪关市| 黄陵县| 贵州省| 遂宁市| 九寨沟县| 铜川市| 班玛县| 桃江县| 长春市| 淮北市| 芮城县| 阜康市| 阳信县| 灌南县| 黄平县|