文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>POSIX 线程2 信号量与互斥量

POSIX 线程2 信号量与互斥量

时间:2009-03-16  来源:jexpo

POSIX信号量与互斥量常用于线程之间的同步与互斥,还有一种是System V的信号量与互斥量,常用于进程间的同步互斥。使用POSIX信号量需要导入<semaphore>
信号量常用的函数有
sem_open() ,sem_close() , sem_unlink()

sem_init(), sem_destroy()

sem_wait()  sem_trywait()  sem_post()  sem_getvalue()

第一行的四个函数用于有名信号量,路径名表示,用于进程间同步
第二行的二个函数用于共享内存的信号量,用于线程间同步
第三行的四个函数是对信号量的操作,哪种情况下都要使用

我们只看基于共享内存的信号量,进程间同步最好用System V信号量

int sem_init(sem_t *sem, int pshared, unsigned int value);
第一个参数为信号量指针,第二个是它的共享值,常为0,表示进程内,用于线程同步,第三个为初始值
int sem_wait(sem_t *sem);
对信号量减1操作,信号量为-1时阻塞,sem_trywait是非阻塞版本
int sem_post(sem_t *sem);
对信号量加1操作
sem_wait与sem_post都是原子操作
int sem_destroy(sem_t *sem);
用于销毁信号量

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

void *thread_function(void *arg);

sem_t bin_sem;

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");
        exit(EXIT_FAILURE);
    }
    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if (res != 0) {
        perror("Thread creation failed");
        exit(EXIT_FAILURE);
    }
    /*包含post或wait的代码*/
    sem_destroy(&bin_sem);
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg) {
    /*包含post或wait的代码*/
    pthread_exit(NULL);
}


互斥mutex量常用的函数如下,其类型为pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
互斥量的创建与销毁函数
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
互斥量的操作函数
其使用方法与信号量semaphore类似

POSIX还有一种条件变量,本书中没有讲到,等回头学习unpv2时再作总结
相关阅读 更多 +
排行榜 更多 +
开局一个小兵最新版

开局一个小兵最新版

休闲益智 下载
火柴人联盟2腾讯qq登录版

火柴人联盟2腾讯qq登录版

体育竞技 下载
tsuki odyssey游戏(月兔冒险奥德赛)

tsuki odyssey游戏(月兔冒险奥德赛)

休闲益智 下载