<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 線程的同步與互斥,死鎖-創(chuàng)新互聯(lián)

            線程的同步與互斥

            創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、三原網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價格優(yōu)惠性價比高,為三原等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

                多個線程同時訪問共享數(shù)據(jù)時可能會發(fā)生沖突,比如兩個線程同時把一個全局變量加1,結(jié)果可能不是我們所期待的:

            我們看這段代碼的執(zhí)行結(jié)果:

               #include <stdio.h>

               #include <stdlib.h>

               #include <pthread.h>

               static int g_count=0;

              void *thread(void *arg)

              {

                  int index=0;

                  int tmp=0;

                  while(index++<5000)

                  {

                      tmp=g_count;

                      printf("this is thread %d,count is :%d\n",(int)arg,tmp);

                      g_count=tmp+1;

                  }

              }

              int main()

              {

                  pthread_t tid1,tid2;

                  pthread_create(&tid1,NULL,thread,(void*)1);

                  pthread_create(&tid2,NULL,thread,(void*)2);

                  pthread_join(tid1,NULL);

                  pthread_join(tid2,NULL);

                  printf("the final value is %d\n",g_count);

                  return 0;

              }

            我們看它的執(zhí)行結(jié)果:

             線程的同步與互斥,死鎖

            我們創(chuàng)建了兩個線程,各自把全局變量g_count加了5000次,結(jié)果理論上應(yīng)該是10000,但其實(shí)不然,每次運(yùn)行的結(jié)果都不一樣,證明訪問沖突了。為了解決這個問題,我們需引入互斥鎖。獲得鎖的線程可以完成“讀--修改--寫”的操作,然后釋放鎖給其他線程,沒有獲得鎖的線程只能等待,而不能訪問共享數(shù)據(jù),這樣“讀--修改--寫”散步操作就成了原子操作,要么都執(zhí)行,要么都不執(zhí)行,不會執(zhí)行到中間而被打斷,這樣就如我們所期待的了。

            pthread_mutex_init函數(shù)對mutex做初始化,它可以被pthread_mutex_destroy銷毀。如果mutex變量是靜態(tài)分配的,也可以用宏定義PTHREAD_MUTEX_INITIALIZER來初始化,相當(dāng)于pthread_mutex_init初始化并且attr參數(shù)為NULL。

            加鎖和解鎖所需函數(shù):

            int pthread_mutex_lock(pthread_mutex_t *mutex)

            int pthread_mutex_trylock(pthread_mutex_t *mutex)

            int pthread_mutex_unlock(pthread_mutex_t *mutex)

                              成功返回0,失敗返回錯誤號。

            一個線程可以調(diào)用int pthread_mutex_lock獲得mutex,如果這時候另一個線程已經(jīng)調(diào)用int pthread_mutex_lock獲得了該mutex,則當(dāng)前線程需要掛起等待,直到另一個線程調(diào)用pthread_mutex_unlock釋放mutex,當(dāng)前線程被喚醒,才能獲得該mutex并繼續(xù)執(zhí)行。

            如果一個線程既想獲得鎖,又不想掛起等待,可以調(diào)用 pthread_mutex_trylock,如果mutex已經(jīng)被另一個線程獲得,則這個函數(shù)會返回EBUSY,而不會使線程掛起等待。

            知道這些的話,我們重新修改以上代碼:

             #include <stdio.h>

             #include <stdlib.h>

             #include <pthread.h>

             static int g_count=0;

            pthread_mutex_t mutex_lock=PTHREAD_MUTEX_INITIALIZER;

              void *thread(void *arg)

              {

                  int index=0;

                  int tmp=0;

                  while(index++<5000)

                  {

                          pthread_mutex_lock(&mutex_lock);

                      tmp=g_count;

                      printf("this is thread %d,count is :%d\n",(int)arg,tmp);

                      g_count=tmp+1;

                      pthread_mutex_unlock(&mutex_lock);

                  }

              }

              int main()

              {

                  pthread_t tid1,tid2;

                  pthread_create(&tid1,NULL,thread,(void*)1);

                  pthread_create(&tid2,NULL,thread,(void*)2);

                  pthread_join(tid1,NULL);

                  pthread_join(tid2,NULL);

                  printf("the final value is %d\n",g_count);

                  return 0;

              }

            運(yùn)行結(jié)果如下:

             線程的同步與互斥,死鎖

            我們可以看到,經(jīng)過我們加鎖后,最后value的值是我們所期待的10000,加鎖成功,成功實(shí)現(xiàn)了兩個線程的互斥運(yùn)行。

            死鎖產(chǎn)生的原因及四個必要條件

            所謂死鎖,是指多個進(jìn)程在運(yùn)行過程中因爭奪資源而造成的一種僵局,當(dāng)進(jìn)程處于這種僵持狀態(tài)時,若無外力作用,他們都將無法再向前推進(jìn)。

            產(chǎn)生死鎖的主要原因有:

            1.系統(tǒng)資源不足;

            2.進(jìn)程運(yùn)行推進(jìn)的順序不合適;

            3.資源分配不當(dāng)?shù)龋?/p>

            如果系統(tǒng)資源充足,進(jìn)程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就降低,否則,就會因爭奪有限的資源而陷入死鎖。其次,進(jìn)程運(yùn)行推進(jìn)順序與速度不同,也可能產(chǎn)生死鎖。

            產(chǎn)生死鎖的四個必要條件:

            1.互斥條件:一個資源每次只能被一個進(jìn)程使用;

            2.請求與保持條件:一個進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放;

            3.不剝奪條件:進(jìn)程已獲得的資源,在使用完之前,不能強(qiáng)行剝奪;

            4.循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系;

            以上是產(chǎn)生死鎖的四個必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。

            處理死鎖的基本方法:

            1.預(yù)防死鎖:

                 該方法是通過設(shè)置某些限制條件,去破壞產(chǎn)生死鎖四個必要條件中的一個或幾個條件,來預(yù)防發(fā)生死鎖。

            2.避免死鎖

                  不需事先采取各種限制措施去破壞產(chǎn)生死鎖的四個必要條件,而是在資源的動態(tài)分配過程中,用某種方法去防止系統(tǒng)進(jìn)入不安全狀態(tài),從而避免發(fā)生死鎖。

            3.檢測死鎖

                  這種方法不需事先采取任何限制措施,也不必檢查系統(tǒng)是否已經(jīng)進(jìn)入不安全區(qū),而是允許系統(tǒng)在運(yùn)行過程中發(fā)生死鎖。但可以通過系統(tǒng)所設(shè)置的檢測機(jī)構(gòu),及時的檢測死鎖的發(fā)生,并精確的確定與死鎖有關(guān)的進(jìn)程資源,然后采取適當(dāng)措施,從系統(tǒng)中將已發(fā)生的死鎖清除掉。

            4.解除死鎖

                  這是與檢測死鎖相配套的一種措施。當(dāng)檢測到發(fā)生死鎖時,需將進(jìn)程從死鎖狀態(tài)中解脫出來。常用的實(shí)施方法是撤消或掛起一些進(jìn)程,以便回收一些資源,再將這些資源分配給已處于阻塞狀態(tài)的進(jìn)程,使之轉(zhuǎn)為就緒狀態(tài),一邊繼續(xù)運(yùn)行。

            死鎖的解除與預(yù)防:

            理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個必要條件,就可以大程度的避免,預(yù)防和解除死鎖。所以在系統(tǒng)設(shè)計(jì),進(jìn)程調(diào)度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進(jìn)程永久占用系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此,對資源的分配要給與合理的規(guī)劃。

            另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

            本文標(biāo)題:線程的同步與互斥,死鎖-創(chuàng)新互聯(lián)
            轉(zhuǎn)載來于:http://www.jbt999.com/article26/ccdejg.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、網(wǎng)站改版響應(yīng)式網(wǎng)站、Google、面包屑導(dǎo)航網(wǎng)站營銷

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            成都seo排名網(wǎng)站優(yōu)化

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 国产乱伦小说网站 | 永久黄网站色视频免费观看w | 性爱福利社| 日韩和亚洲的日本品牌区分米奇777788 | 亚洲操片免费看 |