`
lemoncyb
  • 浏览: 51262 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转]Linux信号量 sem_t简介

阅读更多
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:  

extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  

sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。  

函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。  

函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。  

函数sem_destroy(sem_t *sem)用来释放信号量sem。 

信号量用sem_init函数创建的,下面是它的说明:
#include<semaphore.h>
int sem_init (sem_t *sem, int pshared, unsigned int value);

这 个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前里程的局部信号量;否则,其它进程就能够共享这个信号量。我们现在只对不让进程共享的信号量感兴趣。 (这个参数 受版本影响), pshared传递一个非零将会使函数调用失败。

这两个函数控制着信号量的值,它们的定义如下所示:

#include <semaphore.h>
int sem_wait(sem_t * sem);
int sem_post(sem_t * sem);

这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。
sem_post 函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同 时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它。
sem_wait 函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对 一个值为2的信号量调用sem_wait(),线程将会继续执行,介信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就 会地等待直到有其它线程增加了这个值使它不再是0为止。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加 一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。
信号量这种“只用一个函数就能原子化地测试和设置”的能力下正是它的价值所在。 还有另外一个信号量函数sem_trywait,它是sem_wait的非阻塞搭档。

最后一个信号量函数是sem_destroy。这个函数的作用是在我们用完信号量对它进行清理。下面的定义:
#include<semaphore.h>
int sem_destroy (sem_t *sem);
这个函数也使用一个信号量指针做参数,归还自己战胜的一切资源。在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。
与其它的函数一样,这些函数在成功时都返回“0”。

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

sem_t bin_sem;
void *thread_function1(void *arg)
{
printf("thread_function1--------------sem_wait\n");
sem_wait(&bin_sem);
printf("sem_wait\n");
while (1)
{
}
}

void *thread_function2(void *arg)
{
printf("thread_function2--------------sem_post\n");
sem_post(&bin_sem);
printf("sem_post\n");
while (1)
{
}
}



int main()
{
int res;
pthread_t a_thread;
void *thread_result;

res = sem_init(&bin_sem, 0, 0);
if (res != 0)
{
perror("Semaphore initialization failed");
}
printf("sem_init\n");
res = pthread_create(&a_thread, NULL, thread_function1, NULL);
if (res != 0)
{
perror("Thread creation failure");
}
printf("thread_function1\n");
sleep (5);
printf("sleep\n");
res = pthread_create(&a_thread, NULL, thread_function2, NULL);
if (res != 0)
{
perror("Thread creation failure");
}
while (1)
{
}
}

sem_init
thread_function1
thread_function1--------------sem_wait
sleep
thread_function2--------------sem_post
sem_wait
sem_post
分享到:
评论

相关推荐

    sem_syn.rar_linux syn_信号量_线程 同步

    总结,这个压缩包提供了一个使用Linux信号量实现线程同步的实例,通过`sem_wait()`和`sem_post()`操作确保线程安全地访问共享资源。理解和应用这个示例可以帮助开发者深入理解多线程环境中的同步和互斥问题,提高...

    sem.tar.gz_linux 信号量_linux 封装

    总结来说,"sem.tar.gz_linux 信号量_linux 封装"提供了一套用户友好的Linux信号量接口,对于进行多线程或多进程编程的开发者来说,这是一个非常实用的工具,可以帮助他们更好地管理和保护共享资源,避免并发访问...

    linux信号量详解

    ### Linux信号量详解 #### 一、信号量概念与历史 1965年,E.W.Dijkstra引入了信号量的概念,这是一种操作系统中用于实现进程间互斥和同步的重要机制。信号量本质上是一个包含了非负整型变量的数据结构,伴随着两个...

    Linux之信号量_很全面的分析_个人整理的

    ### Linux之信号量详解 #### 一、信号量概述 信号量是一种用于进程间通信的机制,主要用于协调多个进程对共享资源的访问。通过信号量的机制,可以在多个进程之间同步资源的使用,确保资源在同一时刻只被一个进程...

    linux信号量机制

    总结来说,Linux信号量机制是通过一个计数器实现的同步机制,它允许进程或线程协调对共享资源的访问。`sem_init()`、`sem_post()`、`sem_wait()`、`sem_trywait()`和`sem_destroy()`是其核心函数,它们共同维护了...

    有名信号量示例代码

    在Linux中,有名信号量可以通过`sem_open()`, `sem_post()`, `sem_wait()`, `sem_close()`和`sem_unlink()`等系统调用来操作。 1. **创建有名信号量**: 使用`sem_open()`函数创建有名信号量。该函数需要一个唯一...

    sem_proc_consume.rar_consume

    - 定义信号量:`sem_t sem;` - 初始化信号量:`sem_init(&sem, 0, 1);` 或 `sem_t *sem = sem_open("my_sem", O_CREAT, 0644, 1);` - 生产者部分:`sem_wait(&sem);` 之后进行生产,然后 `sem_post(&sem);` - ...

    sem.rar_SEM_sem.c

    总的来说,`sem.c`程序展示了如何在Linux环境下利用信号量进行进程同步,这对于理解和实践多线程、多进程编程至关重要。通过对这个程序的学习,我们可以掌握信号量的基本用法,从而更好地解决实际项目中的并发控制...

    sem.rar_in_linux semaphore

    本篇文章将深入探讨Linux中的信号量,并围绕标题"sem.rar_in_linux semaphore"和描述"Semaphore in linux programming"展开讨论。 首先,我们需要了解信号量的基本概念。信号量是一个整数值,可以用来表示系统中...

    linux信号量的源码例子

    Linux信号量是一种在多进程或多线程环境中用于同步和保护资源的重要机制。它源于操作系统理论,用于解决并发执行中的竞态条件和死锁问题。在这个源码例子中,我们将深入探讨Linux信号量的工作原理、如何创建、使用...

    Linux信号量1

    【Linux信号量1】 在多进程环境中,当多个进程需要访问同一共享资源时,可能会出现竞态条件,导致数据不一致。为了解决这个问题,Linux提供了信号量机制,这是一种同步工具,用于协调进程间的访问控制。 信号量是...

    linux多线程信号量.pdf

    在Linux中,信号量是通过POSIX标准定义的一系列函数来实现的,这些函数包括:sem_init、sem_wait、sem_trywait、sem_post和sem_destroy等。它们定义在头文件中。 首先,sem_init函数用于初始化一个未命名的信号量,...

    4_posix_sem.tgz

    这个名为"4_posix_sem.tgz"的压缩包文件包含了与使用POSIX信号量相关的源代码示例,主要分为"4_posix_sem_mutex"和"4_posix_sem_sync_mutex"两个部分。 1. **POSIX信号量基本概念** - 计数信号量:可以有非零的...

    Linux信号量线程控制--培训教程.pdf

    ### Linux信号量线程控制详解 #### 一、信号量概念及原理 信号量是操作系统中用于进程或线程间同步与互斥的一种机制。它通常由一个非负的整数计数器组成,用于控制对公共资源的访问。在本章节中,我们将深入探讨...

    Linux互斥锁、条件变量和信号量

    2. 计数信号量:可以控制同时访问资源的线程数量,`sem_t`类型也可以表示计数信号量。 信号量的操作函数包括: - 初始化:`sem_init()`用于初始化信号量。 - P操作(获取):`sem_wait()`或`sem_p()`,若信号量值...

    Linux系统编程-(pthread)线程通信(信号量).pdf

    【Linux系统编程——pthread线程通信(信号量)】 在多线程编程中,线程间的通信和同步是至关重要的,以确保数据的一致性和程序的正确运行。在这个主题中,我们将深入探讨一种用于线程同步的机制——信号量。信号量在...

    无名信号量示例代码

    在Linux中,信号量分为两种类型:有名信号量(命名的,可以跨进程通信)和无名信号量(仅限于同一进程内的线程通信)。本示例主要关注的是无名信号量。 无名信号量的创建通常使用`sem_init()`函数,该函数接收三个...

    操作系统---------信号量机制

    在Linux系统中,信号量通过一系列的系统调用进行操作,如`sem_init()`、`sem_post()`、`sem_wait()`和`sem_destroy()`。 1. **信号量类型与初始化**: 信号量的类型通常表示为`sem_t`,它是一个内含整型变量的数据...

Global site tag (gtag.js) - Google Analytics