linux執行緒同步

2021-10-02 10:58:17 字數 2133 閱讀 5554

1. 互斥鎖

(1)建立互斥鎖:pthread_mutex_t mutex;

(2)初始化這把鎖:pthread_mutex_init(&mutex, null); -- mutex = 1

(3)尋找共享資源: 

操作共享資源的**之前加鎖

pthread_mutex_lock(&mutex);  -- mutex = 0

。。。。。。

。。。。。。             臨界區

pthread_mutex_unlock(&mutex); -- mutex = 1

(4)銷毀互斥鎖:

pthread_mutex_destroy(&mutex);

eg:

#include #include #include #include #include #include #include #define max 10000

// 全域性變數

int number;

pthread_mutex_t mutex

// 執行緒處理函式

void* funca_num(void* arg)

return null;

}void* read_func(void* arg)

return null;

}int main(int argc, const char* ar**)

for(int i=3; i<8; ++i)

// **

for(int i=0; i<8; ++i)

3.條件變數

主要函式:

(1)初始化乙個條件變數:

pthread_cond_init(pthread_cond_t *restrict cond,  const pthread_condattr_t *restrict attr);

(2)銷毀乙個條件變數:pthread_cond_destroy(pthread_cond_t *cond);

(3)阻塞等待乙個條件變數:pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

(4)限時等待乙個條件變數:

pthread_cond_timedwait( pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);

(5)喚醒至少乙個阻塞在條件變數上的執行緒:

pthread_cond_signal(pthread_cond_t *cond);    

(6)喚醒全部阻塞在條件變數上的執行緒

pthread_cond_broadcast(pthread_cond_t *cond);

eg:

#include #include #include #include #include #include #include // 節點結構

typedef struct node

node;

// 永遠指向鍊錶頭部的指標

node* head = null;

// 執行緒同步 - 互斥鎖

pthread_mutex_t mutex;

// 阻塞執行緒 - 條件變數型別的變數

pthread_cond_t cond;

// 生產者

void* producer(void* arg)

return null;

}void* customer(void* arg)

// 鍊錶不為空 - 刪掉乙個節點 - 刪除頭結點

node* pdel = head;

head = head->next;

printf("------ customer: %lu, %d\n", pthread_self(), pdel->data);

free(pdel);

pthread_mutex_unlock(&mutex);

}return null;

}int main(int argc, const char* ar**)

linux 執行緒 執行緒同步

因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...

Linux執行緒同步

1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...

Linux執行緒同步

1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...