glib实践:GAsyncQueue使用方法

news/2024/5/22 16:20:39

前言

这是一个使用GAsyncQueue替代的sem_t的实验。

g_async_queue_pop 在GAsyncQueue *queue中数据为空时,阻塞线程,符合sem_wait的用法。

g_async_queue_push 可以用于平替sem_post。

g_async_queue_new 可以用于平替sem_init

一 函数介绍:

gpointer
g_async_queue_pop (GAsyncQueue *queue);

Pops data from the queue . If queue is empty, this function blocks until data becomes available.

Parameters

        queue :a GAsyncQueue
 
Returns

        data from the queue

void
g_async_queue_push (GAsyncQueue *queue,
                    gpointer data);

 Pushes the data into the queue . data must not be NULL.

Parameters

        queue:a GAsyncQueue 
        data:data to push into the queue

GAsyncQueue *
g_async_queue_new (void);

 Creates a new asynchronous queue.

Returns

        a new GAsyncQueue. Free with g_async_queue_unref()

void
g_async_queue_unref (GAsyncQueue *queue);

 Decreases the reference count of the asynchronous queue by 1.

If the reference count went to 0, the queue will be destroyed and the memory allocated will be freed. So you are not allowed to use the queue afterwards, as it might have disappeared. You do not need to hold the lock to call this function.

Parameters

        queue: a GAsyncQueue.

二 实验验证

测试代码:main.c

#include <glib.h>
#include <stdlib.h>
#include <unistd.h>
#define DEBUG 1
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <assert.h>
#include <errno.h>
#include <signal.h>


int a = 0;
GThread *gt1;
GThread *gt2;
GMutex mutex;
GCond cond;
int count = 0;
sem_t sem;
GAsyncQueue *queue;

gpointer thread_1(gpointer data)
{
    gboolean b;
    long num;
    g_print("thread %ld\n",(long int)data);

    do{
        sleep(2);
        g_print("wait sem\n");
        //sem_wait(&sem);
        num = (long)g_async_queue_pop(queue);
        g_print("num = %ld\n",num);
        g_print("get sem\n");
        g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&mutex);
        g_print("count = %d\n",++count);
        sleep(2);
    }while(1);
    g_print("lock ok\n");
    a+=1;
    return (gpointer)0;
}

gpointer thread_2(gpointer data)
{
    long num = 0;
    sleep(1);
    gboolean b;
    do{
        g_print("begin trylock");
        b = g_mutex_trylock(&mutex);
        g_print("1:b = %d\n",b);
        if(b){
            //sem_post(&sem);
            g_async_queue_push(queue,(gpointer)++num);
            g_print("send sem\n");
            g_mutex_unlock(&mutex);
         }

        sleep(1);
        if(num == 3)break;
        //break;
    }while(1);
}
int main(int argc,char *argv[])
{
    queue = g_async_queue_new();
    sem_init(&sem,0,0);
    g_cond_init(&cond);
    g_mutex_init(&mutex);
    gt1 = g_thread_new("thread1",thread_1,(gpointer)1234);
    gt2 = g_thread_new("thread2",thread_2,(gpointer)10086);
    g_print("hello world\n");
    while(a < 1){
        g_usleep(1000);
    }
    return 0;
}

 编译:

gcc main.c -lglib-2.0 -pthread -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/glib-2.0/ -o app1

或者: 

gcc main.c -pthread `pkg-config --cflags --libs glib-2.0` -o app2

运行结果:

lkmao@ubuntu:/big/glib/x86/GAsyncQueue$ ./app1
hello world
thread 1234
begin trylock1:b = 1
send sem
wait sem
num = 1
get sem
count = 1
begin trylock1:b = 0
begin trylock1:b = 0
begin trylock1:b = 1
send sem
begin trylock1:b = 1
send sem
wait sem
num = 2
get sem
count = 2
wait sem
num = 3
get sem
count = 3
wait sem

 小结


http://lihuaxi.xjx100.cn/news/839022.html

相关文章

关于 ulimit 和file-max 对文件打开数限制实验

/proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量 /proc/sys/kernel/pid_max 系统最大进程数量脚本 创建文件脚本 i0 while [ $i -lt 100000 ] ; dotouch ./filedir/f_$io_file./filedir/f_$iecho "$o_file"echo "file$i" >…

Linux系统之cuda 11情况下如何配置pytorch 10.2

由于目前pytorch1.8.2只能支持到10.2的版本&#xff0c;但ubuntu最新的系统驱动直接支持了cuda 11.4&#xff0c; 并且cuda tooklit支持的默认下载也是11.0。1、确认NVIDIA驱动安装lspci|grep NVIDIA1. 需要先降低cuda tooklit的版本(卸载新版本)cuda-uninstaller in /usr/loca…

计算机组成原理:计算机系统的基本组成

文章目录计算机系统的基本组成背景知识计算机硬件计算机系统的基本组成 背景知识 冯诺依曼体系结构基本特点&#xff1a; (1)计算机由运算器、控制器、存储器、输人设备和输出设备五大部件组成。 (2)采用存储程序的方式&#xff0c;程序和数据存放在同一存储器中&#xff0…

测牛学堂:软件测试python进阶之变量深入理解

变量的深入学习 我们在平时开发过程中&#xff0c;了解到变量是存储数据的即可。但是其实他的底层原理还是比较复杂的。我们可以做一个简单的了解&#xff0c;对我们理解编程&#xff0c;或者以后解决bug&#xff0c;面试&#xff0c;都是有帮助的。 1我们在定义一个变量去存数…

一款基于python的安全即时通讯系统源码,实现类似于QQ的聊天软件

Uchat——基于python的安全即时通讯系统 tips 请不要在同一目录下运行服务端与客户端&#xff0c;否则会因为密钥冲突产生类型错误。即请分别运行服务端与客户端。 目的 设计完成简易的安全即时通讯系统&#xff0c;实现类似于QQ的聊天软件&#xff1b; 需求分析 功能需求…

StarRocks从入门到精通系列六:使用EXPORT、Spark、Flink从StarRocks中导出数据

StarRocks从入门到精通系列六:使用EXPORT、Spark、Flink从StarRocks中导出数据 一、使用EXPORT导出数据1.背景信息2.导出流程3.基本原理4.相关配置5.基本操作6.最佳实践二、使用 Spark 连接器读取数据1.前提条件2.通用参数3.数据样例4.使用Spark SQL读取数据5.使用 Spark Data…

Java数组的定查改增删操作

Java数组的定查改增删操作定义声明创建初始化声明的同时初始化先声明&#xff0c;再初始化查找修改增加 & 删除定义 定义包括声明、创建和初始化三个过程。 声明 声明&#xff0c;就是向编译器说明新变量的类型和名字&#xff0c;不实际分配内存。 int[] array;上面这句…

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用算法(查找算法)

文章目录一、find二、find_if三、adjacent_find四、binary_search五、count六、count_if学习目标&#xff1a; 掌握常用的查找算法 算法简介&#xff1a; find //查找元素find_if //按条件查找元素adjacent_find //查找相邻重复元素binary_search //二分查找法count //统计元…