【线程创建、线程等待、线程退出、线程互斥锁】

线程相关函数

函数名称函数原型
线程创建:pthread_createint pthread_create(pthread_t *thread, const pthread_attr_t *attr,oid *(*start_routine) (void *), void *arg); //线程ID、线程属性、线程函数、线程参数
线程等待:pthread_joinpthread(pthread_t pthread, void *retval) //线程ID、线程退出信息
线程退出:pthread_exitpthread_exit(void* exit_status);
线程ID获取:pthread_selfpthread_self ()
线程互斥锁初始化:pthread_mutex_initpthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)//一线程加锁成功之后,其他申请加锁的线程处于等待
线程加锁:pthread_mutex_lockpthread_mutex_lock (pthread_mutex_t *mutex)//一线程加锁成功之后,其他申请加锁的线程处于等待
线程尝试加锁:pthread_mutex_trylockpthread_mutex_trylock (pthread_mutex_t *mutex)//一线程尝试加锁,如果失败不挂起等待
线程解锁:pthread_mutex_unlockpthread_mutex_unlock (pthread_mutex_t *mutex)//一线程释放锁之后,其他申请加锁的线程按照优先权获取该锁
线程锁销毁:pthread_mutex_destroypthread_mutex_destory (pthread_mutex_t *mutex)//线程锁是占用系统资源的,如果不再使用,可进行销毁,释放空间

Demo

PS:该demo演示采用互斥锁,实现线程同步访问共享资源的场景

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>

//临界(共享)资源定义
int global_cake = 10;

//1、创建锁方法一:采用宏定义,实现静态创建线程锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//2、创建锁方法二:调用线程锁初始化函数,动态创建锁
/*
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
*/

//线程函数声明
void *thread1(void *arg);
void *thread2(void *arg);

//主函数
int main(int argc, char*argv[])
{
    pthread_t pthread1;//定义线程ID
    pthread_t pthread2;
    char *exit_status1 = NULL;
    char *exit_status2 = NULL;
    int arg1 = 8;//定义线程函数参数,可以是整形,字符型等,如有多个参数可定义结构体
    int arg2 = 6;
    /*******1、线程创建*******/
    if(0 != pthread_create(&pthread1, NULL, thread1, (void *)&arg1))
    {
        perror("create thread1 failed!\n");
    }
    if(0 != pthread_create(&pthread2, NULL, thread2, (void *)&arg2))
    {
        perror("create thread2 failed!\n");
    }
    printf("main thread started!ID:%ld\n", (unsigned long)pthread_self());//获取主线程ID
    /*******2、线程等待*******/
    //等待线程退出,并收集线程退出信息。如果不等待,主线程提前退出后,其他线程也随之结束
    pthread_join(pthread1, (void **)&exit_status1);
    pthread_join(pthread2, (void **)&exit_status2);
    //打印线程退出信息:
    printf("exit_status1:%s\n", exit_status1);
    printf("exit_status2:%s\n", exit_status2);
    return 0;
}

//线程1
void *thread1(void *arg)
{
    char *exit_status = "路人甲:吃饱了\n";
    /*******线程加锁*******/
    pthread_mutex_lock(&mutex);//加锁,其他申请加锁的线程处于等待状态
    printf("thread1 started!ID:%ld\n", (unsigned long)pthread_self());//获取线程1的ID
    printf("arg = %d\n", *((int*)arg));//打印线程参数
    printf("路人甲:蛋糕到了,我先吃吧!\n");
    do
    {
        printf("还有:%d份\n", global_cake);
        if(global_cake == 5)
        {      
            printf("路人甲:嗝~~ 我已经吃饱了,还有%d份蛋糕了,都留给你吧\n", global_cake);
            sleep(2);
            /*******线程解锁*******/
            pthread_mutex_unlock(&mutex);//解锁,一经解锁,其他申请加锁的线程将解除等待,立即执行
            /*******线程退出*******/
            pthread_exit((void *)exit_status);//线程退出信息可以是整型,字符型,结构体等数据类型
        }
        sleep(2);
    }while(global_cake--);
}

//线程2
void *thread2(void *arg)
{
    char *exit_status = "路人乙:吃饱了!\n";
    printf("thread2 started!ID:%ld\n", (unsigned long)pthread_self());//获取线程2的ID
    printf("arg = %d\n", *((int*)arg));//打印线程参数
    /*******线程加锁*******/
    pthread_mutex_lock(&mutex);//如果其他线程已经获得锁,则当前线程被阻塞
    printf("路人乙:好的,我要全部吃完\n");
    do
    {
        printf("还有:%d份\n", global_cake);
        if(global_cake == 0)
        {
        	/*******线程解锁*******/
            pthread_mutex_unlock(&mutex);
            printf("路人乙:已经吃饱了,还有%d份蛋糕\n", global_cake);
            /*******线程退出*******/
            pthread_exit((void *)exit_status);
        }
        sleep(2);
    }while(global_cake--);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值