pthread condition的理解

本文详细介绍了pthread条件变量的使用方法,包括初始化、等待、定时等待、销毁、信号发送及广播等函数的应用。并通过一个示例程序展示了如何利用条件变量实现线程间的同步。


pthread condition提供如下函数,用于线程间同步的通知:

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);//创建一个condition的内核变量
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);//等待内核变量变为signaled
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);//在指定时间内等待内核心变量变为signaled
int pthread_cond_destroy(pthread_cond_t *cond);//“析构”一个condition的内核变量
int pthread_cond_signal(pthread_cond_t *cond);//把内核变量置为signaled,指定一个等待线程激活,但不能指定特定线程
int pthread_cond_broadcast(pthread_cond_t *cond);//把内核变量置为signaled,指定所有等待线程激活


condition可以在线程间同步条件,当条件触发后,“生产者”线程通过pthread_cond_signal/pthread_cond_broadcast通知正在pthread_cond_wait/pthread_cond_timewait的“消费者”线程。

如下例:

假设临界变量x,y,“消费者“线程在x>y的时候执行func(x,y)函数,”生产者“线程执行某个动作改变x,y的值。


pthread_cond_t cond;
pthread_mutex_t mutex;

int x,y;//临界变量


void func(int x, int y)
{
 printf("x is greater than y, the value is x,y = %d,%d\n", x, y);
}

//生产者的线程执行函数
void threadfacter()
{
 while(1)
 {
  pthread_mutex_lock(&mutex);
  //do some thing on x, y
  if(x > y)
  {
   pthread_cond_broadcast(&cond);//如果条件符合,则通知消费者线程
  }
  pthread_mutex_unlock(&mutex);
 }
}

void threadcomsumer()
{
 while(1)
 {
  pthread_mutex_lock(&mutex);
  pthread_cond_wait(&cond, &mutex) //如果条件不符合,则释放mutex锁,并等待。如果条件符合,表示条件已经符合,并且尝试再对mutex加锁,如果加锁成功,pthread_cond_wait返回0
  {
   func(x,y);
  }
  pthread_mutex_unlock(&mutex);//
 }
}

int main()
{
 pthread_cond_init(&cond, NULL);
 pthread_mutex_init(&mutex, NULL);
 pthread_t threadfactorID, threadcomsumerID;
 pthread_create(&threadfactorID, NULL, (void *) threadfacter, NULL);
 pthread_create(&threadcomsumerID, NULL, (void *) threadcomsumer, NULL);
 pthread_join(threadfactorID);
 pthread_join(threadcomsumerID); 
}



基于YOLOv8的细胞检测计数系统源码(部署教程+训练好的模型+各项评估指标曲线).zip平均准确率:0.98类别:RBC、WBC、platelets【资源介绍】1、ultralytics-mainultralytics-main为YOLOv8源代码,里面涵盖基于yolov8分类、目标检测额、姿态估计、图像分割四部分代码,我们使用的是detect部分,也就是目标检测代码2、搭建环境安装anaconda 和 pycharm windows系统、mac系统、Linux系统都适配在anaconda中新建一个新的envs虚拟空间(可以参考博客来),命令窗口执行:conda create -n YOLOv8 python==3.8创建完YOLOv8-GUI虚拟空间后,命令窗口执行:source activate YOLOv8 激活虚拟空间然后就在YOLOv8虚拟空间内安装requirements.txt中的所有安装包,命令窗口执行:pip install -r requirements.txt使用清华源安装更快3、训练模型过程进入到\ultralytics-main\ultralytics\yolo\v8\detect\文件夹下,datasets即为我们需要准备好的数据集,训练其他模型同理。data文件夹下的bicycle.yaml文件为数据集配置文件,该文件为本人训练自行车检测模型时创建,训练其他模型,可自行创建。博文有介绍https://blog.csdn.net/DeepLearning_?spm=1011.2415.3001.5343train.py中238行,修改为data = cfg.data or './bicycle.yaml' # or yolo.ClassificationDataset("mnist")237行修改自己使用的预训练模型若自己有显卡,修改239行,如我有四张显卡,即改成args = dict(model=model, data=data, device=”0,1,2,3“)以上配置完成后运行train.py开始训练模型,训练完毕后会在runs/detect/文件夹下生成train*文件夹,里面包含模型和评估指标等4、推理测试训练好模型,打开predict.py,修改87行,model = cfg.model or 'yolov8n.pt',把yolov8n.pt换成我们刚才训练完生成的模型路径(在\ultralytics-main\ultralytics\yolo\v8\detect\runs\detect文件夹下),待测试的图片或者视频存放于ultralytics\ultralytics\assets文件夹,运行predict.py即可,检测结果会在runs/detect/train文件夹下生成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值