网站维护主要内容,经纪人做网站技巧,电子商务网站建设认识,哪个网站可以发宝贝链接做宣传信号量
(1)What#xff08;什么是信号量#xff09; 提供一种计数器的方式控制对共享资源的访问#xff1b;当计数器大于0时#xff0c;请求资源成功并计数器-1#xff1b;当计数器小于0时#xff0c;线程阻塞#xff0c;等待其它线程执行signal#xff08;V操作…信号量
(1)What什么是信号量 提供一种计数器的方式控制对共享资源的访问当计数器大于0时请求资源成功并计数器-1当计数器小于0时线程阻塞等待其它线程执行signalV操作唤醒它 (2)Why信号量的作用
实现线程的同步与互斥通过信号量的设计可以实现对共享资源的串行访问实现线程的等待与通知机制当信号量小于0时当前线程将被阻塞当信号量大于0时会唤醒一个阻塞在信号量上的线程
(3)How如何使用信号量实现线程同步
step01创建信号量 可以看作是创建一个信号量对象 sem_t sem; step02初始化信号量 可以看作是对信号量对象的一个初始化这一过程会给信号量的计数器赋予一个初始值 int sem_init(sem_t *sem, int pshared, unsigned int value); 参数sem被初始化的信号量对象参数pshared默认为0表示信号量用于线程同步其它表示信号量用于进程同步参数value表示信号量的数量常用用于表示共享资源的数量返回值成功返回0失败返回1并设置错误码
step03请求资源 请求获取共享资源此时信号量的计数器减1如果信号量小于1请求失败线程阻塞直到信号量满足条件时解除阻塞 int sem_wait(sem_t *sem); 参数sem请求共享资源如果sem中的计数器大于0则请求成功否则线程阻塞返回值成功返回0失败返回1并设置错误码
step04释放资源 释放共享资源此时信号量的计数器加1此时会唤醒一个等待该共享资源的线程 int sem_post(sem_t *sem);
参数sem释放共享资源sem中的计数器1返回值成功返回0失败返回1并设置错误码 step05销毁信号量 本质就是释放信号量对象的内存空间 int sem_destroy(sem_t *sem); 参数sem将要被销毁的信号量对象返回值成功返回0失败返回1并设置错误码
(4代码实例
以下代码是对共享资源的互斥访问共享资源的个数为5
#include semaphore.h
#include unistd.h
#include iostream
#include pthread.h
using namespace std;
pthread_mutex_t mutex;
sem_t semProc;
sem_t semComu;
struct Node{int iVal;Node * ptrNext;static int iSize;
};
int Node::iSize 0;
Node * head NULL;
void *produce(void *arg){int i 0;while(1){sem_wait(semProc);pthread_mutex_lock(mutex);int iVal i;Node *node new Node;node-iVal iVal;node-ptrNext head-ptrNext;head-ptrNext node;Node::iSize;coutProducing iVal(Node::iSize)endl;pthread_mutex_unlock(mutex);sem_post(semComu);i;sleep(1);}
}
void *consume(void *arg){while(1){sem_wait(semComu);pthread_mutex_lock(mutex);if(head-ptrNext!NULL){coutComsuing head-ptrNext-iVal;Node *ptr head-ptrNext;head-ptrNext ptr-ptrNext;Node::iSize--;delete ptr;cout(Node::iSize)endl;ptr 0;}pthread_mutex_unlock(mutex);sem_post(semProc);sleep(2);return NULL;
}
int main()
{head new Node; pthread_t tidProc, tidComu; sem_init(semProc, 0, 5); sem_init(semComu, 0, 0); pthread_create(tidProc, NULL, produce, NULL); pthread_create(tidComu, NULL, conmuse, NULL); pthread_join(tidProc, NULL); pthread_join(tidComu, NULL); return 0;
}