GLib库对核心应用的支持

news2024/11/16 18:04:10

代码:

/*
 * main.c
 *
 *  Created on: 2024-6-19
 *      Author: root
 */


#include <glib.h>							// 包含GLib函数库
static GMutex *mutex = NULL;
static gboolean t1_end = FALSE;				// 用于结束线程1的标志
static gboolean t2_end = FALSE;				// 用于结束线程2的标志
typedef struct _Arg Arg;
struct _Arg
{
   GMainLoop* loop;						// 该成员为一个GLib实现循环对象
   gint max;
};
void run_1(Arg *arg)							// 线程1函数
{
   int i ;
   for(i=0; i < arg->max; i++) {
      if(g_mutex_trylock(mutex) == FALSE) {
         g_print("%d :thread2 lock mutex target\n", i);
         g_mutex_unlock(mutex);				// 对像解锁
      }
      else
         g_usleep(10);						// 使线程睡眠10秒
   }
   t1_end = TRUE;							// 将该线程结束的标志置为非0
}
void run_2(Arg *arg)							// 线程2函数
{
   int i;
   for(i = 0; i < arg->max; i++) {
      if(g_mutex_trylock(mutex) == FALSE) {
         g_print("%d :thread1 lock mutex target\n", i);
         g_mutex_unlock(mutex);				// 对像解锁
      }
      else
         g_usleep(10);						// 使线程睡眠10秒
   }
   t2_end = TRUE;							// 将该线程结束的标志置为非0
}
void run_3(Arg *arg)							// 线程3函数
{
   for( ; ; ) {								// 建立一个死循环
      if(t1_end && t2_end) {					// 判断线程1和线程2是否已结束
         g_main_loop_quit(arg->loop);			// 退出GLib主循环
         break;
      }
   }
}

int main()
{
   GMainLoop *mloop;						// 创建GLib主循环
   Arg *arg;								// 声明包含指向GLib主循环指针和计数器的结构
   if(!g_thread_supported())					// 判断是否支持GLib线程
      g_thread_init(NULL);
   mloop = g_main_loop_new(NULL, FALSE);		// 开始GLib主循环
   arg = g_new(Arg, 1);
   arg->loop = mloop;
   arg->max = 11;
   mutex = g_mutex_new();					// 创建一个GMutex对象线程池
   g_thread_create(run_1, arg, TRUE, NULL);		// 创建线程1
   g_thread_create(run_2, arg, TRUE, NULL);		// 创建线程2
   g_thread_create(run_3, arg, TRUE, NULL);		// 创建线程3
   g_main_loop_run(mloop);					// 运行主循环
   g_print("thread3exit event cycle\n");
   g_mutex_free(mutex);						// 释放GMutex对象
   g_print("release mutex event\n");
   g_free(arg);								// 清除结构体arg
   g_print("release prar use ram\n");
   return 0;
}

编译

运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1839475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anti-human IL-10 mAb (12G8), biotin:Mabtech热销品

Anti-human IL-10 mAb (12G8), biotin该单克隆抗体能够在ELISpot、FluoroSpot和ELISA等免疫分析方法中特异性检测人白介素10&#xff08;IL-10&#xff09;。可以将该单克隆抗体12G8作为检测抗体与单克隆抗体9D7&#xff08;ca#3430-3&#xff09;作为捕获抗体配对用于ELISpot、…

js语法---理解反射Reflect对象和代理Proxy对象

Reflect 基本要点 反射&#xff1a;reflect是一个内置的全局对象&#xff0c;它的作用就是提供了一些对象实例的拦截方法&#xff0c;它的用法和Math对象相似&#xff0c;都只有静态方法和属性&#xff0c;同时reflect也没有构造器&#xff0c;无法通过new运算符构建实例对象&…

vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能

一、项目场景&#xff1a; 1、使用vue开发了一套h5页面的项目 2、这个h5链接是在企业微信里某个地方打开的 3、打开页面的时候有一个好友列表&#xff0c;点击好友列表某一条复制手机号跳转到企业微信添加好友页面 二、实现的效果图 博客只允许上传gif图&#xff0c;所以我只…

SQL注入-下篇

HTTP注入 一、Referer注入 概述 当你访问一个网站的时候&#xff0c;你的浏览器需要告诉服务器你是从哪个地方访问服务器的。如直接在浏览器器的URL栏输入网址访问网站是没有referer的&#xff0c;需要在一个打开的网站中&#xff0c;点击链接跳转到另一个页面。 Less-19 判…

预算有限?如何挑选经济适用的ERP系统?

中小企业在运营过程中&#xff0c;经常面临着一个共同的挑战——如何在有限的预算内挑选到一款既符合业务需求又经济适用的ERP系统。然而&#xff0c;市场上ERP系统种类繁多&#xff0c;价格差异大&#xff0c;功能复杂&#xff0c;使得许多企业在选择时感到迷茫和困惑。 如果…

【BEV】BEVFormer总结

本文分享BEV感知方案中&#xff0c;具有代表性的方法&#xff1a;BEVFormer。 它基于Deformable Attention&#xff0c;实现了一种融合多视角相机空间特征和时序特征的端到端框架&#xff0c;适用于多种自动驾驶感知任务。 主要由3个关键模块组成&#xff1a; BEV Queries Q&am…

带你了解甘肃独特的调料-苦豆粉

在众多的调味料中&#xff0c;苦豆粉是一种相对小众但却极具特色的存在。今天&#xff0c;就让我们一起深入探究甘肃特产苦豆粉的奇妙世界。苦豆粉&#xff0c;又被称为胡巴豆、大巴豆等&#xff0c;它主要源自于一种豆科植物。很多人初次接触苦豆粉时&#xff0c;可能会被它独…

13.2 Go 接口的动态性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

RK3588 Android12音频驱动分析全网最全

最近没有搞音频相关的了&#xff0c;在搞BMS, 把之前的经验总结一下。 一、先看一下Android 12音频总架构 从这张图可以看到音频数据流一共经过了3个用户空间层的进程&#xff0c;然后才流到kernel驱动层。Android版本越高&#xff0c;通用性越高&#xff0c;耦合性越低&#…

【Portswigger 学院】CORS

教程和靶场来源于 Burpsuite 的官网 Portswigger&#xff1a;Cross-origin resource sharing (CORS) - PortSwigger 跨域资源共享&#xff08;Cross-origin resource sharing&#xff0c;CORS&#xff09;是一种浏览器机制&#xff0c;允许浏览器访问不同源的资源。同源策略的作…

【Python】已解决Python错误:ImportError: cannot import name get_column_letter的报错解决办法

【Python】已解决Python错误&#xff1a;ImportError: cannot import name get_column_letter的报错解决办法 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家…

Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程

项目介绍 开源的项目&#xff0c;感谢各位大佬的贡献&#xff01; 官方介绍&#xff1a;一个简单的本地网页界面&#xff0c;使用ChatTTS将文字合成为语音&#xff0c;同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into spe…

没有名为 keras.preprocessing 的模块

估计是因为版本原因 我安装的是 3.3.3版本 >>> import keras >>> print(keras.__version__) 3.3.3 keras.preprocessing.image 将 keras.preprocessing.image 改为 from keras_preprocessing.image 之后报image_type啥的错误&#xff0c;后面查找之后…

C++ 84 之 文件读写

#include <iostream> #include <cstring> #include <string> using namespace std; #include <fstream> // 文件流的头文件int main() {// 写入: 文件内容// (文件位置&#xff0c; 如果这个不存在&#xff0c; 就新建一个)// 写法1&#xff1a; of…

JAVA实现利用phantomjs对URL页面(网页)进行转图片保存

一、前期准备 1、下载phantomjs工具 地址&#xff1a;https://phantomjs.org/download.html 解压到指定文件夹&#xff0c;后续代码要调用该工具&#xff0c;记住路径 2、准备好模板NetToPicMoban.js 用于给phantomjs提供需要执行的js&#xff0c;具体放在那看自己的需求&…

运算放大器(运放)缓冲器(跟随器)电路

运算放大器(Operational Amplifier) 运算放大器(Operational Amplifier)是一种差分放大器&#xff0c;具有高输入电阻、低输出电阻、高开放增益&#xff08;开环增益&#xff09;&#xff0c;并具有可放大输入引脚与-输入引脚间的电压差的功能。 设计目标 输入输入输出输出频…

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。在2024年&#xff0c;PSAI插件StartAI因其强大的功能和易用性&#xff0c;成为了Photoshop用户的得力帮手。下面来给大家详细介…

银行数仓项目实战(五)--搭建数仓和数据标准化

文章目录 搭建数仓数据采集 标准层 搭建数仓 数据采集 业务系统源 -》ODS贴源层&#xff0c;添加标签&#xff0c;添加系统来源&#xff0c;添加时间戳 问甲方要建表语句&#xff0c;自己添加etldt字段和来源字段&#xff0c;通过之前文章教的Kettle把数据抽到自己数据库中。…

远程桌面另一台服务器连接不上,局域网IP如何访问另一台服务器

在IT运维工作中&#xff0c;远程桌面连接是日常工作中不可或缺的一部分。然而&#xff0c;当尝试远程桌面连接至另一台服务器时&#xff0c;如果连接不上&#xff0c;可能会引发一系列问题&#xff0c;影响到工作效率和信息安全。特别是在局域网环境中&#xff0c;确保能够正确…

MySQL学习——创建MySQL Workbench中的Connections

在MySQL Workbench中&#xff0c;Connections&#xff08;连接&#xff09;是用户与MySQL数据库进行交互的桥梁。 本文将添加一个新连接&#xff0c;该连接可以是初始连接&#xff0c;也可以是附加连接。在开始之前&#xff0c;必须安装、启动MySQL服务器的实例&#xff0c;并…