歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux 多線程學習一:互斥

linux 多線程學習一:互斥

日期:2017/3/3 12:41:09   编辑:Linux技術

#include<iostream>
#include<pthread.h>
using namespace std;

pthread_t pt[2];
pthread_mutex_t mtx;
int num = 100;

void *func_thread(void* input)
{
        while(1)
        {
                pthread_mutex_lock(&mtx);
                if(num <= 0 || num >= 200)
                        pthread_exit(0);
                cout<<"this is thread:"<<(char*)input <<endl;
                if(0 == strcmp((char*)input,"thread1"))
                {
                        num++;
                }
                else
                {
                        num--;
                }
                cout<<"now num="<<num<<endl;
                pthread_mutex_unlock(&mtx);
                sleep(1);
        }
}

int main()
{
        pthread_create(&pt[0],NULL,func_thread,(void*)"thread1");
        pthread_create(&pt[1],NULL,func_thread,(void*)"thread2");
        pthread_join(pt[0],NULL);
        pthread_join(pt[1],NULL);
        return 0;
}
加入sleep的目的是防止資源一直被“thread1”占用

編譯的時候要包含pthread庫:

g++ thread_test.cpp -lpthread -o a.out

關於互斥鎖我們主要可以用到下面3個函數(引自百度百科):

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_unlock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經被占據時返回EBUSY而不是掛起等待。

另外互斥鎖還有動態和靜態創建的區別,我這裡采用的是靜態創建,動態創建需要用到:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)

int pthread_mutex_destroy(pthread_mutex_t *mutex)

其中pthread_mutexattr_t表示的是互斥鎖的屬性(引自百度百科):

互斥鎖的屬性在創建鎖的時候指定,在LinuxThreads實現中僅有一個鎖類型屬性,不同的鎖類型在試圖對一個已經被鎖定的互斥鎖加鎖時表現不同。

當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:

* PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖以後,其余請求鎖的線程將形成一個等待隊列,並在解鎖後按優先級獲得鎖。這種鎖策略保證了資源

分配的公平性。

* PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,並通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。

* PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當不允許多次加鎖時不會

出現最簡單情況下的死鎖。

* PTHREAD_MUTEX_ADAPTIVE_NP,適應鎖,動作最簡單的鎖類型,僅等待解鎖後重新競爭。

Copyright © Linux教程網 All Rights Reserved