zl程序教程

您现在的位置是:首页 >  其他

当前栏目

多线程编程(二)(李慧芹)

2023-04-22 10:59:53 时间

(37条消息) 互斥锁(mutex)_清风徐来Groot的博客-CSDN博客

Linux中提供一把互斥锁mutex(也称之为互斥量)。 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。

1、主要应用函数:

pthread_mutex_init() 初始化一个互斥锁
pthread_mutex_destroy() 销毁一个互斥锁
pthread_mutex_lock() 加锁
pthread_mutex_trylock() 尝试加锁
pthread_mutex_unlock() 解锁

1.1 互斥锁的初始化的两种方式:静态初始化和动态初始化

静态初始化:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

动态初始化:pthread_mutex_init(&mutex, NULL);

例一:

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
 
void *func(void *arg)
{
    while (1) 
    {
        printf("hello ");
        
        /*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/
        sleep(1);	
        
        printf("world
");
        sleep(1);//睡眠,释放cpu
    }
 
    return NULL;
}

int main(void)
{
    pthread_t tid;
    pthread_create(&tid, NULL, func, NULL);
    while (1) 
	{
        printf("HELLO ");
        sleep(1);
        printf("WORLD
");      
        sleep(1);
    }
    return 0;
}

 例二:

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
 
pthread_mutex_t mutex;      //定义锁
 
void *func(void *arg)
{
    while (1) {
        pthread_mutex_lock(&mutex);  //加锁
 
        printf("hello ");
        sleep(1);	/*模拟长时间操作共享资源,导致cpu易主,产生与时间有关的错误*/
        printf("world
");
        pthread_mutex_unlock(&mutex); //解锁
 
        sleep(1);//睡眠,释放cpu
    }
 
    return NULL;
}
 
int main(void)
{
    pthread_t tid;
    pthread_mutex_init(&mutex, NULL);  //初始化锁 mutex==1
    pthread_create(&tid, NULL, func, NULL);
    while (1) 
	{
        pthread_mutex_lock(&mutex); //加锁
 
        printf("HELLO ");
        sleep(1);
        printf("WORLD
");
        pthread_mutex_unlock(&mutex); //解锁
 
        sleep(1);
    }
   
    pthread_mutex_destroy(&mutex);  //销毁锁
 
    return 0;
}