linux程式設計---執行緒---互斥鎖
阿新 • • 發佈:2019-01-07
執行緒間同步機制
互斥鎖通訊機制
互斥以排他方式防止共享資料被併發修改。
(1)在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,
並立即佔有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。
(2)只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作無效。
初始化鎖
靜態初始化互斥鎖
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
動態初始化互斥鎖
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
銷燬互斥鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);
申請互斥鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
以非阻塞方式申請互斥鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);
釋放互斥鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
程式示例如下
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>
void *tfun(void *arg);
pthread_mutex_t gmutex;
#define BUF 1024
char gdata[BUF];
int gtime = 0;
int main(int argc,char*argv[])
{
int res;
pthread_t th1;
void *thret;
res = pthread_mutex_init(&gmutex,0);
if(res != 0)
{
printf("mutex initialization failed\n");
exit(-1);
}
res = pthread_create(&th1,0,tfun,0);
if(res != 0)
{
printf("thread create failed\n");
exit(-1);
}
pthread_mutex_lock(&gmutex);
printf("input some text,enter 'exit' to finished\n");
while(!gtime)
{
fgets(gdata,BUF,stdin);
pthread_mutex_unlock(&gmutex);
while(1)
{
pthread_mutex_lock(&gmutex);
if(gdata[0] != '\0')
{
pthread_mutex_unlock(&gmutex);
sleep(1);
}
else
break;
}
}
pthread_mutex_unlock(&gmutex);
printf("\n waiting for thread to finish ...\n");
res = pthread_join(th1,&thret);
if(res != 0)
{
printf("thread join failed\n");
exit(-1);
}
pthread_mutex_destroy(&gmutex);
exit(0);
}
void *tfun(void * arg)
{
sleep(1);
pthread_mutex_lock(&gmutex);
while(strncmp("end",gdata,3) != 0)
{
printf("you input %d bytes %s\n",strlen(gdata)-1,gdata);
gdata[0] = '\0';
pthread_mutex_unlock(&gmutex);
sleep(1);
pthread_mutex_lock(&gmutex);
while(gdata[0] == '\0')
{
pthread_mutex_unlock(&gmutex);
sleep(1);
pthread_mutex_lock(&gmutex);
}
}
gtime = 1;
gdata[0] = '\0';
pthread_mutex_unlock(&gmutex);
pthread_exit(0);
}
互斥鎖通訊機制
互斥以排他方式防止共享資料被併發修改。
(1)在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,
並立即佔有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。
(2)只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作無效。
初始化鎖
靜態初始化互斥鎖
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
動態初始化互斥鎖
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
銷燬互斥鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);
申請互斥鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
以非阻塞方式申請互斥鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);
釋放互斥鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
程式示例如下
程式共兩個執行緒,一個執行緒負責從輸入裝置讀取資料,然後存在在全域性變數中,
另一個執行緒負責將全域性變數輸出到輸出裝置中。
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>
void *tfun(void *arg);
pthread_mutex_t gmutex;
#define BUF 1024
char gdata[BUF];
int gtime = 0;
int main(int argc,char*argv[])
{
int res;
pthread_t th1;
void *thret;
res = pthread_mutex_init(&gmutex,0);
if(res != 0)
{
printf("mutex initialization failed\n");
exit(-1);
}
res = pthread_create(&th1,0,tfun,0);
if(res != 0)
{
printf("thread create failed\n");
exit(-1);
}
pthread_mutex_lock(&gmutex);
printf("input some text,enter 'exit' to finished\n");
while(!gtime)
{
fgets(gdata,BUF,stdin);
pthread_mutex_unlock(&gmutex);
while(1)
{
pthread_mutex_lock(&gmutex);
if(gdata[0] != '\0')
{
pthread_mutex_unlock(&gmutex);
sleep(1);
}
else
break;
}
}
pthread_mutex_unlock(&gmutex);
printf("\n waiting for thread to finish ...\n");
res = pthread_join(th1,&thret);
if(res != 0)
{
printf("thread join failed\n");
exit(-1);
}
pthread_mutex_destroy(&gmutex);
exit(0);
}
void *tfun(void * arg)
{
sleep(1);
pthread_mutex_lock(&gmutex);
while(strncmp("end",gdata,3) != 0)
{
printf("you input %d bytes %s\n",strlen(gdata)-1,gdata);
gdata[0] = '\0';
pthread_mutex_unlock(&gmutex);
sleep(1);
pthread_mutex_lock(&gmutex);
while(gdata[0] == '\0')
{
pthread_mutex_unlock(&gmutex);
sleep(1);
pthread_mutex_lock(&gmutex);
}
}
gtime = 1;
gdata[0] = '\0';
pthread_mutex_unlock(&gmutex);
pthread_exit(0);
}