如何实现linux下多线程之间的互斥与同步

如何实现linux下多线程之间的互斥与同步,第1张

同步和异步的区别:1、同步就是说多个任务之间是有先后关系的,一个任务需要等待另一个任务执行完毕才能继续执行。2、异步就是说多个任务之间没有先后关系,不需要相互等待各做各的事。同步编程方法:1、信号量2、互斥量异步无需考虑资源冲突,不需特别处理。

互斥锁(mutex) 通过锁机制实现线程间的同步。

1、初始化锁。在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。

2、静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

3、动态分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr)

4、加锁。对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。

    int pthread_mutex_lock(pthread_mutex *mutex)

    int pthread_mutex_trylock(pthread_mutex_t *mutex)

    解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。

    int pthread_mutex_unlock(pthread_mutex_t *mutex)

    销毁锁。锁在是使用完成后,需要进行销毁以释放资源。

    int pthread_mutex_destroy(pthread_mutex *mutex)

    #include <cstdio>  

    #include <cstdlib>  

    #include <unistd.h>  

    #include <pthread.h>  

    #include "iostream"  

    using namespace std  

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER  

    int tmp  

    void* thread(void *arg)  

    {  

        cout << "thread id is " << pthread_self() << endl  

        pthread_mutex_lock(&mutex)  

        tmp = 12  

        cout << "Now a is " << tmp << endl  

        pthread_mutex_unlock(&mutex)  

        return NULL  

    }  

    int main()  

    {  

        pthread_t id  

        cout << "main thread id is " << pthread_self() << endl  

        tmp = 3  

        cout << "In main func tmp = " << tmp << endl  

        if (!pthread_create(&id, NULL, thread, NULL))  

        {  

            cout << "Create thread success!" << endl  

        }  

        else  

        {  

            cout << "Create thread failed!" << endl  

        }  

        pthread_join(id, NULL)  

        pthread_mutex_destroy(&mutex)  

        return 0  

    }  

    //编译:g++ -o thread testthread.cpp -lpthread

目测是线程退出时没有解开互斥锁,导致其它线程一直在等互斥锁被解开。

以下是修改后的thrd_func函数代码:

//线程函数入口

void *thrd_func(void *arg)

{

    int thrd_num = (int)arg

    int delay_time = 0

    int count = 0

    int res

    res = pthread_mutex_lock(&mutex)//互斥锁上锁

    if(res)

    {

        printf("Thread %d lock failed\n",thrd_num)

        pthread_exit(NULL)

    }

    printf("Thread %d is starting\n",thrd_num)

    for(count = 0count < REPEAT_NUMBERcount++)

    {

        delay_time = (int)(rand()%5)//随机时间数

        sleep(delay_time)

        printf("\tThread %d: job %d delay =%d\n",thrd_num,count,delay_time)

    }

    

    pthread_mutex_unlock(&mutex) // 解开互斥锁

    

    printf("Thread %d finished\n",thrd_num)

    pthread_exit(NULL)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/8279456.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存