linux 同步等待
创始人
2025-01-27 02:05:40
0

    对于多进程并发的程序,进程之间的同步等待是非常重要的。而在Linux中,同步等待的实现有多种方式。本文将介绍几种常见的同步等待方式,并对它们进行详细分析和讨论。

    1.信号量

    信号量是一种非常常见的同步等待机制,它可以用来实现多个进程之间的同步操作。当一个进程需要访问一个共享资源时,它需要使用sem_wait()函数来获取该资源的访问权限,如果该资源已经被其他进程占用,则该进程会被挂起,直到该资源被释放为止。当一个进程访问完该资源后,需要使用sem_post()函数来释放该资源。

    下面是一个简单的使用信号量进行同步等待的示例:

    #include

    #include

    #include

    #include

    #include

    #include

    intmain()

    {

    intsemid;

    structsembufsembuf;

    key_tkey;

    //创建信号量

    if((key=ftok(".",'a'))==-1){

    perror("ftok");

    exit(-1);

    }

    if((semid=semget(key,1,IPC_CREAT|0666))==-1){

    perror("semget");

    exit(-1);

    }

    //初始化信号量

    semctl(semid,0,SETVAL,0);

    //等待信号量

    sembuf.sem_num=0;

    sembuf.sem_op=-1;

    sembuf.sem_flg=SEM_UNDO;

    if(semop(semid,&sembuf,1)==-1){

    perror("semop");

    exit(-1);

    }

    printf("HelloWorld!\n");

    //释放信号量

    sembuf.sem_num=0;

    sembuf.sem_op=1;

    sembuf.sem_flg=SEM_UNDO;

    if(semop(semid,&sembuf,1)==-1){

    perror("semop");

    exit(-1);

    }

    return0;

    }

    2.条件变量

    条件变量是另一种常见的同步等待机制,它可以用来实现进程之间的通信和同步。当一个进程需要等待某个条件满足时,它可以使用pthread_cond_wait()函数来等待该条件的发生。当另一个进程满足该条件后,它需要使用pthread_cond_signal()或pthread_cond_broadcast()函数来通知等待的进程。

    下面是一个简单的使用条件变量进行同步等待的示例:

    #include

    #include

    #include

    #include

    intflag=0;

    pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

    pthread_cond_tcond=PTHREAD_COND_INITIALIZER;

    void*thread_func(void*arg)

    {

    pthread_mutex_lock(&mutex);

    printf("Thread:Waitforcondition...\n");

    while(flag==0){

    pthread_cond_wait(&cond,&mutex);

    }

    printf("Thread:Conditionsatisfied.\n");

    pthread_mutex_unlock(&mutex);

    returnNULL;

    }

    intmain()

    {

    pthread_ttid;

    intret;

    //创建线程

    ret=pthread_create(&tid,NULL,thread_func,NULL);

    if(ret!=0){

    perror("pthread_create");

    exit(-1);

    }

    sleep(1);

    //修改条件

    pthread_mutex_lock(&mutex);

    flag=1;

    pthread_cond_signal(&cond);

    pthread_mutex_unlock(&mutex);

    //等待线程退出

    ret=pthread_join(tid,NULL);

    if(ret!=0){

    perror("pthread_join");

    exit(-1);

    }

    return0;

    }

    3.互斥锁

    互斥锁是一种常见的同步等待机制,它可以用来保护共享资源的访问。当一个进程需要访问一个共享资源时,它需要使用pthread_mutex_lock()函数来获取该资源的访问权限,如果该资源已经被其他进程占用,则该进程会被挂起,直到该资源被释放为止。当一个进程访问完该资源后,需要使用pthread_mutex_unlock()函数来释放该资源。

    下面是一个简单的使用互斥锁进行同步等待的示例:

    #include

    #include

    #include

    #include

    intcounter=0;

    pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;

    void*thread_func(void*arg)

    {

    inti;

    for(i=0;i<1000000;i++){

    pthread_mutex_lock(&mutex);

    counter++;

    pthread_mutex_unlock(&mutex);

    }

    returnNULL;

    }

    intmain()

    {

    pthread_ttid1,tid2;

    intret;

    //创建线程

    ret=pthread_create(&tid1,NULL,thread_func,NULL);

    if(ret!=0){

    perror("pthread_create");

    exit(-1);

    }

    ret=pthread_create(&tid2,NULL,thread_func,NULL);

    if(ret!=0){

    perror("pthread_create");

    exit(-1);

    }

    //等待线程退出

    ret=pthread_join(tid1,NULL);

    if(ret!=0){

    perror("pthread_join");

    exit(-1);

    }

    ret=pthread_join(tid2,NULL);

    if(ret!=0){

    perror("pthread_join");

    exit(-1);

    }

    printf("Counter:%d\n",counter);

    return0;

    }

    4.文件锁

    文件锁是一种比较特殊的同步等待机制,它可以用来保护一个文件的访问。当一个进程需要访问一个文件时,它可以使用fcntl()函数来获取该文件的锁,如果该文件已经被其他进程占用,则该进程会被挂起,直到该文件被释放为止。当一个进程访问完该文件后,需要使用fcntl()函数来释放该文件。

    下面是一个简单的使用文件锁进行同步等待的示例:

    #include

    #include

    #include

    #include

    intmain()

    {

    intfd;

    structflockflock;

    //打开文件

    if((fd=open("test.txt",O_RDWR))==-1){

    perror("open");

    exit(-1);

    }

    //获取文件锁

    flock.l_type=F_WRLCK;

    flock.l_whence=SEEK_SET;

    flock.l_start=0;

    flock.l_len=0;

    if(fcntl(fd,F_SETLKW,&flock)==-1){

    perror("fcntl");

    exit(-1);

    }

    printf("HelloWorld!\n");

    //释放文件锁

    flock.l_type=F_UNLCK;

    if(fcntl(fd,F_SETLK,&flock)==-1){

    perror("fcntl");

    exit(-1);

    }

    return0;

    }

    总结

    本文介绍了Linux下常见的几种同步等待机制,包括信号量、条件变量、互斥锁和文件锁。这些机制各有优缺点,可以根据实际情况选择适合自己的机制来实现进程之间的同步等待。

src-TVRZNMTY4NTI2MzQyMAaHR0cHM6Ly9wNC5pdGMuY24vaW1hZ2VzMDEvMjAyMTEwMTkvODY1NmM3ZjY0ODdmNGIzZmFkMTE1ZWRkZGNjMzFjMmIucG5n.jpg

whatsapp官网版下载:https://cjge-manuscriptcentral.com/software/3773.html

相关内容

热门资讯

安卓换鸿蒙系统会卡吗,体验流畅... 最近手机圈可是热闹非凡呢!不少安卓用户都在议论纷纷,说鸿蒙系统要来啦!那么,安卓手机换上鸿蒙系统后,...
安卓系统拦截短信在哪,安卓系统... 你是不是也遇到了这种情况:手机里突然冒出了很多垃圾短信,烦不胜烦?别急,今天就来教你怎么在安卓系统里...
app安卓系统登录不了,解锁登... 最近是不是你也遇到了这样的烦恼:手机里那个心爱的APP,突然就登录不上了?别急,让我来帮你一步步排查...
安卓系统要维护多久,安卓系统维... 你有没有想过,你的安卓手机里那个陪伴你度过了无数日夜的安卓系统,它究竟要陪伴你多久呢?这个问题,估计...
windows官网系统多少钱 Windows官网系统价格一览:了解正版Windows的购买成本Windows 11官方价格解析微软...
安卓系统如何卸载app,轻松掌... 手机里的App越来越多,是不是感觉内存不够用了?别急,今天就来教你怎么轻松卸载安卓系统里的App,让...
怎么复制照片安卓系统,操作步骤... 亲爱的手机控们,是不是有时候想把自己的手机照片分享给朋友,或者备份到电脑上呢?别急,今天就来教你怎么...
安卓系统应用怎么重装,安卓应用... 手机里的安卓应用突然罢工了,是不是让你头疼不已?别急,今天就来手把手教你如何重装安卓系统应用,让你的...
iwatch怎么连接安卓系统,... 你有没有想过,那款时尚又实用的iWatch,竟然只能和iPhone好上好?别急,今天就来给你揭秘,怎...
安装了Anaconda之后找不... 在安装Anaconda后,如果找不到Jupyter Notebook,可以尝试以下解决方法:检查环境...