当前位置: 首页 > news >正文

骨干专业建设验收网站装饰设计公司排名

骨干专业建设验收网站,装饰设计公司排名,建被采集的网站,网页设计教程 罗云芳吴黎文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 #xff08;1#xff09; 线程同步概念 竞态条件#xff1a;因为时序问题#xff0c;而导致程序异常. 饥饿问题#xff1a;只使用互相锁保证线程安全时#xff0c;锁资源总被某… 文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 1 线程同步概念 竞态条件因为时序问题而导致程序异常. 饥饿问题只使用互相锁保证线程安全时锁资源总被某一个线程占用的情况。 线程同步线程同步是指在多线程编程中为了保证临界资源的正确访问和避免竞态条件需要协调和控制线程之间的执行顺序和互斥访问。让线程能够按照某种特定的顺序访问临界资源从而有效避免饥饿问题。常见的线程同步机制包括互斥锁Mutex、信号量Semaphore、条件变量Condition Variable等。 条件变量使用 在多线程编程中有需要等待某个资源就绪线程才能开始正常运行的需求。 例如一个线程访问队列时发现队列为空它只能等待只到其它线程将一个节点添加到队列中。这种情况就需要用到条件变量。 条件变量是一种线程同步的高级机制它可以实现线程的等待和唤醒操作。条件变量通常与互斥锁一起使用当某个条件不满足时线程可以调用条件变量的等待操作进入等待状态当条件满足时其他线程可以调用条件变量的唤醒操作来唤醒等待的线程。 // 1.初始化条件变量 //cond为要初始化的条件变量 int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); //2.等待条件满足 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); //3.唤醒等待 //唤醒所有在等待的线程 int pthread_cond_broadcast(pthread_cond_t *cond); //随机唤醒一个真在等待的线程 int pthread_cond_signal(pthread_cond_t *cond);例子 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include pthread.hpthread_cond_t cond; pthread_mutex_t mutex;void *r1( void *arg ) {while ( 1 ){pthread_cond_wait(cond, mutex);printf(活动\n);} }void *r2(void *arg ) {while ( 1 ) {pthread_cond_signal(cond);sleep(1);} }int main( void ) {pthread_t t1, t2;pthread_cond_init(cond, NULL);pthread_mutex_init(mutex, NULL);pthread_create(t1, NULL, r1, NULL);pthread_create(t2, NULL, r2, NULL);pthread_join(t1, NULL);pthread_join(t2, NULL);pthread_mutex_destroy(mutex);pthread_cond_destroy(cond); }条件变量实际使用规范 ①等待条件代码 pthread_mutex_lock(mutex); while (条件为假 pthread_cond_wait(cond, mutex); 修改条件 pthread_mutex_unlock(mutex);②给条件发送信号代码 pthread_mutex_lock(mutex); 设置条件为真 pthread_cond_signal(cond); pthread_mutex_unlock(mutex);条件” 可以理解为需要等待就绪的资源。 条件为假:线程代码运行需要的资源未就绪。 条件为真线程代码运行需要的资源就绪。 修改条件使用资源。 生产消费模型 产者消费者模型是一种常见的并发编程模型用于解决多线程环境下的生产者和消费者之间的协作问题。在这个模型中生产者负责生产数据并将数据放入共享的缓冲区中而消费者则负责从缓冲区中取出数据并进行消费。 该模型的基本思想是通过一个共享的缓冲区来实现生产者和消费者之间的同步与通信。生产者在生产数据之前会检查缓冲区是否已满如果已满则等待直到有空闲位置。而消费者在消费数据之前会检查缓冲区是否为空如果为空则等待直到有数据可供消费。 为了实现这种同步与通信可以使用互斥锁mutex来保护缓冲区的访问以及条件变量condition variable来实现生产者和消费者之间的等待和通知机制。 信号量的使用 此处的信号量使用指的是对POSIX信号量的使用POSIX信号量可以用于线程间同步。 //1.初始化信号量 //pshared0表示线程间共享信号量 //value 表示信号量的初始值 int sem_init(sem_t *sem, int pshared, unsigned int value); //2.等待信号量会将信号量的值减 int sem_wait(sem_t *sem); //3.发布信号量表示资源使用完毕可以归还资源了。将信号量值加1 int sem_post(sem_t *sem); //4.销毁信号量 int sem_destroy(sem_t *sem);#include stdio.h #include stdlib.h #include pthread.h #include semaphore.h#define NUM_THREADS 5sem_t semaphore;void* thread_function(void* arg) {int thread_id *(int*)arg;printf(Thread %d is waiting...\n, thread_id);sem_wait(semaphore);printf(Thread %d has acquired the semaphore.\n, thread_id);// 模拟线程执行一些任务sleep(2);printf(Thread %d is releasing the semaphore.\n, thread_id);sem_post(semaphore);pthread_exit(NULL); }int main() {pthread_t threads[NUM_THREADS];int thread_ids[NUM_THREADS];// 初始化信号量初始值为1sem_init(semaphore, 0, 1);// 创建多个线程for (int i 0; i NUM_THREADS; i) {thread_ids[i] i;pthread_create(threads[i], NULL, thread_function, thread_ids[i]);}// 等待所有线程结束for (int i 0; i NUM_THREADS; i) {pthread_join(threads[i], NULL);}// 销毁信号量sem_destroy(semaphore);return 0; }读写锁的使用 在编写多线程的时候有一种情况是十分常见的。那就是有些公共数据修改的机会比较少。相比较改写它们读的机会反而高的多。通常而言在读的过程中往往伴随着查找的操作中间耗时很长。给这种代码段加锁会极大地降低我们程序的效率。 为了专门处理这种情况有了读写锁。 使用 // 1. 设置读写优先级 // attr指向要设置属性的读写锁的指针 // pref 共有3种选择 //PTHREAD_RWLOCK_PREFER_READER_NP优先选择读者。 //PTHREAD_RWLOCK_PREFER_WRITER_NP优先选择写者。 //PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP优先选择非递归写者。 int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);//2. 初始化 //rwlock用于指定要初始化的读写锁对象。 //attr设置为nullptr int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);//3. 加锁和解锁/*pthread_rwlock_rdlock函数用于获取读写锁的读取锁定。 读取锁定允许多个线程同时持有锁只要没有线程持有写入锁。 如果有线程持有写入锁则其他线程尝试获取读取锁会被阻塞直到写入锁被释放。*/ int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);/* pthread_rwlock_wrlock函数用于获取读写锁的写入锁定。 写入锁定是独占的只能由一个线程持有。如果有线程持有读取锁或写入锁 则其他线程尝试获取写入锁会被阻塞直到所有读取锁和写入锁都被释放 */ int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//用于释放读写锁 int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);实际使用 #include stdio.h #include pthread.h// 共享资源 int shared_data 0;// 读写锁 pthread_rwlock_t rwlock;// 读线程函数 void* reader_function(void* arg) {int thread_id *(int*)arg;while (1) {// 获取读锁pthread_rwlock_rdlock(rwlock);// 读取共享资源printf(Reader %d reads shared data: %d\n, thread_id, shared_data);// 释放读锁pthread_rwlock_unlock(rwlock);// 等待一段时间sleep(1);}pthread_exit(NULL); }// 写线程函数 void* writer_function(void* arg) {int thread_id *(int*)arg;while (1) {// 获取写锁pthread_rwlock_wrlock(rwlock);// 修改共享资源shared_data;printf(Writer %d updates shared data: %d\n, thread_id, shared_data);// 释放写锁pthread_rwlock_unlock(rwlock);// 等待一段时间sleep(2);}pthread_exit(NULL); }int main() {pthread_t readers[3];pthread_t writers[2];int reader_ids[3] {1, 2, 3};int writer_ids[2] {1, 2};// 初始化读写锁pthread_rwlock_init(rwlock, NULL);// 创建读线程for (int i 0; i 3; i) {pthread_create(readers[i], NULL, reader_function, reader_ids[i]);}// 创建写线程for (int i 0; i 2; i) {pthread_create(writers[i], NULL, writer_function, writer_ids[i]);}// 等待读线程结束for (int i 0; i 3; i) {pthread_join(readers[i], NULL);}// 等待写线程结束for (int i 0; i 2; i) {pthread_join(writers[i], NULL);}// 销毁读写锁pthread_rwlock_destroy(rwlock);return 0; }
http://www.w-s-a.com/news/719764/

相关文章:

  • 团购网站建设目的网站有很多304状态码
  • 运用阿里云怎么做网站外资企业可以在中国境内做网站吗
  • 云南住房和城乡建设局网站西安做官网的公司
  • 企业网站图片上传网站建设和应用的情况
  • 网站不显示内容吗聊城网架公司
  • 南昌网站建设企业网站托管外包怎么做
  • 做非洲外贸的网站网站可以用PS设计吗
  • PHP搭建IDC网站青岛福瀛建设集团网站
  • 安徽网站优化多少钱软件界面设计的基本原则
  • 网站建设动态页面修改删除dnf卖飞机的网站怎么做的
  • 万网是做什么的seo综合
  • 网站关键词分隔符php网站开发平台下载
  • 郑州那家做网站便宜商业计划书免费word版
  • 秦时明月的个人网站怎么做网站开发公司需要招聘哪些人
  • 广告网站建设制作设计服务商安卓app软件定制
  • 公司网站设计与实现中国职业培训在线官方网站
  • 网站服务器空间租用郑州官网网站推广优化
  • 郑州网站建设外包业务wordpress站酷首页
  • 机关门户网站 建设 方案个人怎么申请注册商标
  • 梧州网站建设有哪些九江网站建设优化
  • APP网站建设开发企业发展英文seo招聘
  • 临海市住房和城乡建设规划局网站高校图书馆网站的建设方案
  • 建立门户网站张店易宝网站建设
  • wordpress中英文站点厦门seo顾问屈兴东
  • 邯郸网站建设项目重庆网站备案系统
  • 网站导航容易做黄冈网站建设报价
  • 美橙互联建站网站被截止徐州网站建站
  • 网站班级文化建设视频深圳企业网页设计公司
  • 钦州网站建设公司做宣传网站买什么云服务器
  • 58同城有做网站wordpress怎么改标题和meta