【Linux】Semaphore信号量线程同步的例子

 

0、 信号量

Linux下的信号量和windows下的信号量稍有不同。

 

Windows

Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同。  而且Windows下的信号量是一个【内核对象】,在整个OS都可以访问到。

 

Linux

Linux下的信号量在创建的时候可以指定一个初始值,这个初始值也是最大值。 而且Linux下的信号量可以根据需要设置为是否是【进程间共享】的,如果不是进程间共享的则就是一个本进程局部信号量。

 

 1、相关API

int semt_init(
 semt_t* sem,     //a semaphore pointer
 int     pshared, //0 as a local semaphore of cuurent process, or the semaphore can be shared between mulit processes
 unsigned value   //the init  value of this memaphore
 )


//minus ONE  value of semaphore
int sem_wait(sem_t* sem);

//add ONE value of semaphore
int sem_post(sem_t* sem);


//destroy the semaphore
int sem_destroy(sem_t* sem);

All  the functions above Rerurn ZERO  IF SUCCESS !

 

 

 

 

2、上代码

 这个demo创建了5个线程,信号量的初始值为2,即同时最多有2个线程可以获得获得信号量从而得到执行。

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
using namespace std;

sem_t g_semt;

void* work_thread(void* p)
{
    pthread_t tID = pthread_self();

    cout << "-------" << tID << " is waiting for a semaphore -------" << endl;    
    sem_wait(&g_semt);
    cout << "-------" << tID << " got a semaphore, is Runing -------" << endl << endl;
    usleep(1000 * 1000 * 2);  //2 seconds
    sem_post(&g_semt);

    static char* pRet = "thread finished! \n";

    return pRet;
}

int main()
{
    const size_t nThreadCount = 5; //amounts of thread array
    const unsigned int nSemaphoreCount = 2; //initial value of semaphore
    int nRet = -1;
    void* pRet = NULL;
    pthread_t threadIDs[nThreadCount] = {0};
    
    nRet = sem_init(&g_semt, 0, nSemaphoreCount);
    if (0 != nRet)
        return -1;

    for (size_t i = 0; i < nThreadCount; ++ i)
    {
        nRet = pthread_create(&threadIDs[i], NULL, work_thread, NULL); 
        if (0 != nRet)
            continue;
    }

    for (size_t i = 0; i < nThreadCount; ++ i)
    {
        int nRet2 = pthread_join(threadIDs[i], &pRet);
        cout << endl << threadIDs[i] << " return value is " << (char*)pRet << endl;
    }

    cout << endl << endl;

    sem_destroy(&g_semt);

    return 0;
}

 

 

 

   

 

 

4、执行情况

 编译 g++ -D_REENTRANT  -lpthread   semaphore.cpp  -g  -o  semaphore.out

 

 

 

  

转载于:https://www.cnblogs.com/cuish/p/4133919.html

在嵌入式Linux平台下,多线程之间的同步和互斥可以使用信号量来实现。信号量是一种多线程间通信的机制,用于控制多个线程对共享资源的访问。 使用信号量需要引入头文件#include <semaphore.h>。 信号量的基本操作有三个函数: 1. sem_init():初始化信号量,设置信号量的初值。 2. sem_wait():等待信号量,如果信号量值为0,则线程阻塞等待,否则信号量值减1,线程继续执行。 3. sem_post():释放信号量,将信号量值加1。 下面是一个使用信号量实现线程同步例子: ```c #include <pthread.h> #include <semaphore.h> #include <stdio.h> sem_t sem; //定义信号量 int count = 0; //共享资源 void *thread_func(void *arg) { sem_wait(&sem); //等待信号量 count++; //对共享资源进行操作 printf("Thread %d: count = %d\n", *(int *)arg, count); sem_post(&sem); //释放信号量 pthread_exit(NULL); } int main() { pthread_t thread[5]; int i, id[5]; sem_init(&sem, 0, 1); //初始化信号量 for (i = 0; i < 5; i++) { id[i] = i; pthread_create(&thread[i], NULL, thread_func, &id[i]); } for (i = 0; i < 5; i++) { pthread_join(thread[i], NULL); } sem_destroy(&sem); //销毁信号量 return 0; } ``` 上面的例子中,共有5个线程同时对count变量进行操作,但是通过信号量的使用,保证了每次只有一个线程能够访问共享资源。信号量sem的初值为1,表示有一个线程能够访问共享资源,其他线程需要等待。每个线程在访问共享资源之前都需要等待信号量sem,如果sem为0,则线程阻塞等待,否则sem减1,线程访问共享资源。当一个线程访问完共享资源之后,需要释放信号量sem,将sem加1,其他线程就可以访问共享资源了。最后,销毁信号量sem。 需要注意的是,在使用信号量时,要保证信号量的使用是线程安全的,否则会导致竞争条件的发生。在多线程环境下,使用信号量还需要考虑死锁的问题,避免出现死锁现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值