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

电商网站支付接口高校招生网站建设

电商网站支付接口,高校招生网站建设,wordpress user role,西安高端网站建设文章目录 前言一、读写锁二、条件变量总结 前言 一、读写锁 多线程同步机制中的读写锁(Read-Write Lock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。 读…

文章目录

  • 前言
  • 一、读写锁
  • 二、条件变量
  • 总结

前言


一、读写锁

多线程同步机制中的读写锁(Read-Write Lock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。

读写锁的基本原则是:多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当有线程持有写锁时,其他线程无法获取读锁或写锁,直到写操作完成并释放写锁。

读写锁有两种状态:读模式下加锁状态(读锁),写模式下加锁状态(写锁)。读写锁只有一把。

1. 读写锁的特性: 写独占,读共享。

  • 读写锁是 “ 写模式加锁 ” 时,解锁前,所有对该锁加锁的线程都会被阻塞。
  • 读写锁是 “ 读模式加锁 ” 时,如果线程以读模式 则对其加锁会成功;如果线程是以写模式加锁会阻塞。
  • 读写锁是 “ 读模式加锁 ” 时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞读模式请求。优先满足写模式加锁。读写锁并行阻塞,写锁优先级高。

2. 读写锁相关函数:

  • 初始化,pthread_rwlock_init
  • 获取读锁:使用pthread_rwlock_rdlock函数获取读锁。
  • 获取写锁:使用pthread_rwlock_wrlock函数获取写锁。
  • 释放锁:使用pthread_rwlock_unlock函数释放读锁或写锁。
  • 销毁读写锁:在不再需要时,使用pthread_rwlock_destroy函数销毁读写锁。

3. 示例代码:
下面代码设置一个写进程 和 三个读进程区访问共享资源。

(void*)i 将整数 i 转换为 void* 类型。在线程的函数中,需要将其转换回整数类型,以便使用它。可以使用 (int)arg 将 void* 转换回 int 类型。void* 是一种通用的泛型指针,可以在不关心具体类型的情况下进行转换和操作。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;		// 初始化读写锁int data = 1;void *write_thread (void *arg)
{while(1){pthread_rwlock_wrlock(&rwlock);data += 1;printf("write : data = %d\n",data);	pthread_rwlock_unlock(&rwlock);sleep(rand() %3);					// 随机休眠,让出 cpu资源}pthread_exit(NULL);
}void *read_thread (void *arg)
{int i = (int )arg;while(1){pthread_rwlock_rdlock(&rwlock);printf("read %d : data = %d\n",i, data);	pthread_rwlock_unlock(&rwlock);sleep(rand() %3);}pthread_exit(NULL);
}int main(void)
{pthread_t r_tid[5], w_tid;srand(time(NULL));// 创建多个读线程for (int i = 0; i < 3; i++) {pthread_create(&r_tid[i], NULL, read_thread, (void*)i);}pthread_create(&w_tid, NULL, write_thread, NULL);for(int j=0;j<3;j++)pthread_join(r_tid[j],NULL);pthread_join(w_tid,NULL);pthread_rwlock_destroy(&rwlock);return 0;
}

在这里插入图片描述

二、条件变量

在多线程编程中,条件变量是一种用于线程之间进行通信和同步的机制。条件变量允许一个线程等待特定的条件发生,并在条件满足时通知其他线程继续执行。条件变量本身不是锁。条件变量常与互斥锁(mutex)结合使用,以实现线程之间的同步操作。

1. 相关函数:

(1) 对条件变量进行初始化,并可指定属性。通常使用默认属性,可以传入 NULL。

 int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

(2) 销毁条件变量,释放相关资源。

int pthread_cond_destroy(pthread_cond_t *cond);
  • 当前线程等待条件变量满足,并释放关联的互斥锁。该函数会阻塞线程直至条件变量被通知。
    在调用 pthread_cond_wait() 之前,必须先获得与条件变量关联的互斥锁 mutex 的锁,然后该函数会自动释放 mutex 的锁(自动 unlock),并让线程进入等待状态,直到被另一个线程通过 pthread_cond_signal() 或 pthread_cond_broadcast() 唤醒(自动 lock)。
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

(3) 通知等待在条件变量上的一个线程,使其继续执行。如果有多个线程等待,只通知其中一个线程。

int pthread_cond_signal(pthread_cond_t *cond);

(4) 通知所有等待在条件变量上的线程,使它们都继续执行。

int pthread_cond_broadcast(pthread_cond_t *cond) ;

2. 示例代码:
描述生产者 和 消费者的关系。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>struct msg
{int num;struct msg* pnext;
};struct msg *head = NULL;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;void *producer_thread (void *arg)							// 生产者线程
{while(1){	struct msg *info = malloc(sizeof(struct msg));info->num = rand() % 1000 + 1;pthread_mutex_lock(&mutex);info->pnext = head;head = info;pthread_mutex_unlock(&mutex);// 唤醒阻塞的线程pthread_cond_signal(&cond);			printf("--------------------- producer : %d\n",info->num);sleep(rand() % 3);}return NULL;
}void *customer_thread (void *arg)					// 消费者线程
{while(1){struct msg *info;		pthread_mutex_lock(&mutex);if(head == NULL){pthread_cond_wait(&cond, &mutex);			// 阻塞线程,等待有数据。}info = head;head = info->pnext;pthread_mutex_unlock(&mutex);printf("customer : =============== %d\n",info->num);free(info);info = NULL;sleep(rand() % 3);}return NULL;
}int main(void)
{pthread_t pid,cid;srand(time(NULL));						// 设置随机种子int ret = pthread_create(&pid, NULL, producer_thread, NULL);if(ret != 0){printf("prodecer_thread_create error\n");}ret = pthread_create(&cid, NULL, customer_thread, NULL);if(ret != 0){printf("consumer_thread_create error\n");}pthread_join(pid, NULL);					// 等待回收线程,获取退出线程的状态pthread_join(cid, NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}

总结

http://www.yayakq.cn/news/273835/

相关文章:

  • 网站建设及维护专业wordpress绑定多个域名的方法
  • 网站建设催款函广州代做网站
  • 网站建设app开发合同游戏网络游戏
  • 网站备案要多少钱学校网站建设评审会议通知
  • 石家庄网站建设吧专业团队优质网站建设方案
  • 深圳龙岗建网站公司长春财经学院是公办还是民办
  • 网站怎么做跳出提示筐网站开发软件网站开发
  • 设计网站中如何设置特效做网站延期交付了
  • 新乡手机网站建设哪家好什么是网络设计图
  • 公司要做网站最新房价数据出炉
  • 创新的品牌网站建设中国建设工程协会标准网站
  • 上传网站程序平台推广是什么工作
  • 山东三强建设咨询有限公司网站泰安做网站建设的公司
  • 如何汇报网站建设wordpress检查元素
  • 湘潭本地的网站建设公司码支付wordpress用不
  • 网站对于企业的意义wordpress 做管理系统
  • 做公司宣传册的网站用网站做数据库
  • 唐山城乡建设网站免费发布招聘信息
  • 网站建设需要找工信部吗云南省城市建设培训中心网站
  • 莱芜钓鱼网站一个公司做网站需要注意什么条件
  • 免费做网站app服装公司网站定位
  • 做网站什么什么网站建设 验证码
  • 做美食视频网站有哪些网站索引量是什么意思
  • 做垂直平台网站项目管理软件 project教程
  • 网站创意模板vuecms网站开发
  • 网站建设 图片wordpress 当前页描述
  • asp网站程序优点怎样让网站被百度收录
  • 千岛湖建设集团办公网站自己网上怎么接单
  • 幸福宝推广app网站下载高端网站建设哪些好
  • 郑州免费建站做服装的外贸网站