快速业务通道

Linux下多线程编程简介(四)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-28
除了上次讲的互斥锁,使用信号量也就是操作系统中所提到的PV原语,也能达到互斥和同步的效果,这就是下面要说的信号量线程控制. PV原语是对整数计数器信号量sem的操作,一次P操作可使sem减一,而一次V操作可是sem加一.进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限.当信号量的值大于零或等于零的时候,该进程(或线程)具有对公共资源访问的权限,否则,当信号量的值小于时,该进程(或线程)就会被阻塞,直到信号量的值大于或等于一. 在LINUX中,实现了POSIX的无名信号量,主要用于线程间的互斥同步,下面将简单介绍一些函数接口: sem_init 功能: 用于创建一个信号量,并初始化信号量的值. 函数原型: int sem_init (sem_t* sem, int pshared, unsigned int value); int sem_wait (sem_t* sem); int sem_trywait (sem_t* sem); int sem_post (sem_t* sem); int sem_getvalue (sem_t* sem); int sem_destroy (sem_t* sem); 功能: sem_wait和sem_trywait相当于P操作,它们都能将信号量的值减一,两者的区别在于若信号量的值小于零时,sem_wait将会阻塞进程,而sem_trywait则会立即返回. sem_post相当于V操作,它将信号量的值加一,同时发出唤醒的信号给等待的进程(或线程). sem_getvalue 得到信号量的值. sem_destroy 摧毁信号量. 程序实例如下: #include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define return_if_fail(p)
if(!p) { printf("[%s]:func error!", __func__); return; }
typedef struct _PrivInfo {
sem_t sem;
int lock_var;
time_t end_time;
}PrivInfo;
void info_init(PrivInfo *thiz);
void *pthread_function1(void *paramthiz);
void *pthread_function2(void *paramthiz);

int main (int argc, char** argv) {
pthread_t pt_1 = 0;
pthread_t pt_2 = 0; int ret = 0; PrivInfo *thiz = NULL; thiz = (PrivInfo*)malloc(sizeof(PrivInfo)); if(NULL == thiz) {
return -1;
} printf("thread2 unlock.n");

sleep(3);
}

pthread_exit(NULL);
}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号