对重庆电子政务网站建设评价,长沙市旅游景点,广告版面设计图片,电商平台制作公司抢票的例子 竞争过程 进程A被切走 进程B被切走 结论#xff1a; 互斥 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
mutex: 指向要初始化的互斥锁的指针。attr: 用于设置互斥锁属性的指针#xff0c;通常可以传入 NULL 以使用默认属性…
抢票的例子 竞争过程 进程A被切走 进程B被切走 结论 互斥 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
mutex: 指向要初始化的互斥锁的指针。attr: 用于设置互斥锁属性的指针通常可以传入 NULL 以使用默认属性。 锁的本质
加锁 解锁 线程安全与重入 死锁 线程同步 生产消费模型 例子 条件变量 demo
#includeiostream
#includestring
#includepthread.h
#includeunistd.hint tickets1000;
pthread_mutex_t mutexPTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condPTHREAD_COND_INITIALIZER;void *start_routine(void* args){std::string namestatic_castconst char*(args);while(true){pthread_mutex_lock(mutex);pthread_cond_wait(cond,mutex);std::coutname-ticketsstd::endl;tickets--;pthread_mutex_unlock(mutex);}return nullptr;
}int main(){const int num5;pthread_t tid[num]{};for(int i0;inum;i){char *namenew char[64];snprintf(name,sizeof(name),thread %d,i1);pthread_create(tidi,nullptr,start_routine,name);}while(true){std::coutmain thread weak upstd::endl;pthread_cond_signal(cond);sleep(1);}for(int i0;inum;i){pthread_join(tid[i],nullptr);}return 0;} 信号量 常用函数 环形队列 环形队列代码
#includeRingQueue.hpp
#includeunistd.h
#includepthread.h
#includerandom
#includeiostreamvoid *ProductorRoutine(void* rq){RingQueueint *ringqueuestatic_castRingQueueint*(rq);while(true){int datarand()%101;ringqueue-Push(data);std::cout生产完成 生产的数据是datastd::endl;sleep(1);}
}void *ConsumerRoutine(void *rq){RingQueueint *ringqueuestatic_castRingQueueint*(rq);while(true){int data;ringqueue-Pop(data);std::cout消费完成 消费数据是datastd::endl;sleep(1);}
}int main(){srand((unsigned int)time(nullptr)^getpid()^pthread_self());RingQueueint *rqnew RingQueueint();pthread_t p,c;pthread_create(p,nullptr,ProductorRoutine,rq);pthread_create(c,nullptr,ConsumerRoutine,rq);pthread_join(p,nullptr);pthread_join(c,nullptr);}
#includesemaphore.h
#includevector
#includecassert
#includectime
#includesys/types.hstatic const int gcap5;templateclass T
class RingQueue{
public:void P(sem_t sem){int nsem_wait(sem);assert(n0);(void)n;}void V(sem_t sem){int nsem_post(sem);assert(n0);(void)n;}public:RingQueue(const int capgcap):_q(cap),_cap(cap){int nsem_init(_spaceSem,0,_cap);assert(n0);nsem_init(_dataSem,0,0);assert(n0);productorStepConsumerStep0;}void Push(const T in){P(_spaceSem);_q[productorStep]in;productorStep%_cap;V(_dataSem);}void Pop(T out){P(_dataSem);out_q[ConsumerStep];ConsumerStep%_cap;V(_spaceSem);}~RingQueue(){sem_destroy(_spaceSem);sem_destroy(_dataSem);}private:std::vectorT _q;int _cap;sem_t _spaceSem; //生产者 空间资源sem_t _dataSem; //消费者 数据资源int productorStep;int ConsumerStep;
};