Linux中的线程与C中的信号量同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中的线程与C中的信号量同步相关的知识,希望对你有一定的参考价值。

我有一个示例程序,用于使用Mutex在Linux操作系统上同步线程。线程负责递增计数器值。旁注:我仍然是这方面的初学者,仍然在学习理解这个概念

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

void *thread_func();

phtread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;

int main(){
    int ret1, ret2;
    pthread_t thread1, thread2;

    if((ret1=pthread_create(&thread1, NULL, &thread_func, NULL)))
    printf("Phtread_create is failed: %d
", ret1);

    if((ret2=pthread_create(&thread2, NULL, &thread_func, NULL)))
    printf("Phtread_create failed: %d
", ret2);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    return 0;
}

void *thread_func(void *param){
    pthread_mutex_lock( &mutex1 );
    counter++;
    printf("Counter value: %d
",counter);
    pthread_mutex_unlock( &mutex1 );
    pthread_exit(0);
}

我的问题是我想修改上面的程序,以便使用Semaphore完成同步。但我不知道如何修改它。欢迎任何建议和解决方案。非常感谢

答案

有必要检查是否可以在不使用pthread_mutex_init()通过引用手册页或在线示例进行初始化的情况下使用互斥锁。有两种类型的信号量,sysV信号量和posix信号量。对于开始posix信号量是好的开始。它命名了信号量(通过sem_open())和未命名的信号量(通过sem_init())。要像mutex一样使用它,只需将其计数为1,每个sem_wait如果计数为1则将其递减为0或等待它从0变为1.一旦信号量被释放sem_post()它。手册页很适合参考。

以上是关于Linux中的线程与C中的信号量同步的主要内容,如果未能解决你的问题,请参考以下文章

(转载)Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

C++0x 没有信号量?如何同步线程?

Linux 多线程

Linux 多线程

Linux 多线程

关于条件变量与互斥锁信号量的区别,Linux下线程同步的几种方法