linux程式多執行緒互斥鎖的簡單使用
思路:
首先定義一個互斥鎖變數;然後初始化該互斥鎖pthread_mutex_init;
使用臨界區資源的時候首先獲取該鎖pthread_mutex_lock(如果無法獲取資源則執行緒會阻塞,直到該資源可以使用),對臨界區資源使用完時候釋放該互斥鎖pthread_mutex_unlock;
#include <pthread.h>
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
例項1:不使用互斥鎖,多個執行緒輸出,此時的效果是多個執行緒是並行輸出的,沒有對資源的訪問進行控制
/*************************************************************************
> File Name: threadbase.c
> Author:
> Mail:
> Created Time: 2015騫?2鏈?4鏃?鏄熸湡浜?17鏃?4鍒?8縐?
************************************************************************/
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
typedef struct Threadinfo{
char name[64];
int age;
int numId;
}ThreadInfo;
int nNum, nLoop;
/*
#include <pthread.h>
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int g_num = 999;
void *thread_routine(void *arg)
{
int i = 0;
// pthread_detach(pthread_self());
ThreadInfo * p = (ThreadInfo *)arg;
// pthread_mutex_lock(&mutex);
for (i = 0; i < nLoop; ++i){
printf("thread id is :%ld, i = %d, numid is %d, g_num is %d\n", pthread_self(), i, p->numId, g_num);
sleep(1);
}
printf("child exit: %ld\n", pthread_self());
// pthread_mutex_unlock(&mutex);
pthread_exit(arg);
}
int main()
{
int i = 0;
pthread_t tidArray[200];
ThreadInfo tmp;
printf("input the number of thread:");
scanf("%d", &nNum);
printf("input the number of nLoop:");
scanf("%d", &nLoop);
for (i = 0; i < nNum; ++i){
memset(&tmp, 0, sizeof(ThreadInfo));
tmp.numId= 100;
pthread_create(&tidArray[i], NULL, thread_routine, &tmp);
}
for (i = 0; i < nNum; ++i){
pthread_join(tidArray[i], NULL);
}
printf("parent exit\n");
exit(0);
}
例項2:對多個執行緒進行控制,用互斥鎖對資源的訪問進行控制,每次只能有一個執行緒訪問該資源;
/*************************************************************************
> File Name: threadbase.c
> Author:
> Mail:
> Created Time: 2015騫?2鏈?4鏃?鏄熸湡浜?17鏃?4鍒?8縐?
************************************************************************/
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
typedef struct Threadinfo{
char name[64];
int age;
int numId;
}ThreadInfo;
int nNum, nLoop;
/*
#include <pthread.h>
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int g_num = 999;
void *thread_routine(void *arg)
{
int i = 0;
// pthread_detach(pthread_self());
ThreadInfo * p = (ThreadInfo *)arg;
pthread_mutex_lock(&mutex);
for (i = 0; i < nLoop; ++i){
printf("thread id is :%ld, i = %d, numid is %d, g_num is %d\n", pthread_self(), i, p->numId, g_num);
sleep(1);
}
printf("child exit: %ld\n", pthread_self());
pthread_mutex_unlock(&mutex);
pthread_exit(arg);
}
int main()
{
int i = 0;
pthread_t tidArray[200];
ThreadInfo tmp;
printf("input the number of thread:");
scanf("%d", &nNum);
printf("input the number of nLoop:");
scanf("%d", &nLoop);
for (i = 0; i < nNum; ++i){
memset(&tmp, 0, sizeof(ThreadInfo));
tmp.numId= 100;
pthread_create(&tidArray[i], NULL, thread_routine, &tmp);
}
for (i = 0; i < nNum; ++i){
pthread_join(tidArray[i], NULL);
}
printf("parent exit\n");
exit(0);
}
此例中的互斥鎖是靜態初始化的,也可以使用函式pthread_mutex_init(&mutex, NULL)來進行初始化;
不過通過例項測試,即使不初始化也是可以的,只不過是沒有自定義的屬性;
相關文章
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- Linux之執行緒互斥鎖Linux執行緒
- 執行緒的互斥鎖執行緒
- 執行緒同步與互斥:互斥鎖執行緒
- Linux Qt使用POSIX多執行緒條件變數、互斥鎖(量)LinuxQT執行緒變數
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 畫江湖之 PHP 多執行緒開發 【執行緒安全 互斥鎖】PHP執行緒
- 畫江湖之 PHP 多執行緒開發 [執行緒安全 互斥鎖]PHP執行緒
- python多執行緒、鎖、event事件機制的簡單使用Python執行緒事件
- 多執行緒之死鎖就是這麼簡單執行緒
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- Java 多執行緒併發程式設計之互斥鎖 Reentrant LockJava執行緒程式設計
- 執行緒安全佇列(使用互斥鎖進行實現)執行緒佇列
- 執行緒安全: 互斥鎖和自旋鎖(10種)執行緒
- windows多執行緒同步--互斥量Windows執行緒
- linux多執行緒-----同步機制(互斥量、讀寫鎖、條件變數)Linux執行緒變數
- 多執行緒_鎖執行緒
- 廣義多執行緒安全之鎖與iOS鎖簡單介紹執行緒iOS
- linux多執行緒-----同步物件(互斥量、讀寫鎖、條件變數)的屬性Linux執行緒物件變數
- ObjC 多執行緒簡析(二)- os_unfair_lock的型別和自旋鎖與互斥鎖的比較OBJ執行緒AI型別
- wxWidgets簡單的多執行緒執行緒
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- windows多執行緒同步互斥--總結Windows執行緒
- 多執行緒併發鎖分類以及簡單例項執行緒單例
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- Java多執行緒-鎖的區別與使用Java執行緒
- Golang多執行緒簡單鬥地主Golang執行緒
- 多執行緒 -- 初學簡單例子執行緒單例
- Linux多執行緒消費者和生產者模型例項(互斥鎖和條件變數使用)Linux執行緒模型變數
- 多執行緒鎖的問題執行緒
- 多執行緒互斥鎖訪問演算法(上)------Peterson演算法執行緒演算法
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 互斥鎖mutex的簡單實現Mutex