linux和android端的pthread学习
本文起初主要想写个演示样例实測下pthread_mutex_lock和pthread_mutex_trylock差别。在linux机器上非常快就over了,可是想了一下。pthread是unix系的,在windows没办法直接执行代码非常不方便。于是想到了android,windows上安装ndk,手机root就能够跑pthread代码咯。。。
demo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h> typedef pthread_t pt_t;
typedef unsigned int uint_t; pthread_mutex_t mt = PTHREAD_MUTEX_INITIALIZER; void lock_func(void* arg)
{
pid_t pid; //process
pt_t tid; // thread pid = getpid();
tid = pthread_self(); printf("want to lock mutex, msg=%s, tid=%u\n", (char*)arg, (uint_t)tid); pthread_mutex_lock( &mt );
printf("I[tid=%u] am using, (*|^_^|*)\n", (uint_t)tid);
sleep(10);
pthread_mutex_unlock( &mt );
} void try_lock_func(void* arg)
{
uint_t tid = (uint_t)pthread_self();
int counter = 0; while ( pthread_mutex_trylock( &mt ) )
{
sleep(1);
++counter; printf("after sleep 1s, i [tid=%u] want to try again, iter=%d.\n", tid, counter);
}
printf("It is my[tid=%u] turn, so long i waited...msg=%s\n", tid, (char*)arg);
pthread_mutex_unlock( &mt );
} #define XX_CREATE_FAILED(err) \
printf("create thread error : %s\n", strerror(err));\
return 1; int main()
{
int rc;
pt_t pt1, pt2, pt3; const char* msg1 = "block";
const char* msg2 = "unblock"; rc = pthread_create(&pt1, NULL, (void*)&lock_func, (void*)msg1); if (rc != 0)
{
XX_CREATE_FAILED(rc);
} rc = pthread_create(&pt2, NULL, (void*)&lock_func, (void*)msg1); if (rc != 0)
{
XX_CREATE_FAILED(rc);
}
sleep(1); rc = pthread_create(&pt3, NULL, (void*)&try_lock_func, (void*)msg2); if (rc != 0)
{
XX_CREATE_FAILED(rc);
} pthread_join(pt1, NULL);
pthread_join(pt2, NULL);
pthread_join(pt3, NULL);
return 0;
}
代码思路也非常好理解:创建三个线程。1和2通过lock方式去争抢mt相互排斥锁,3线程则灵活,每隔1秒去检測下mt相互排斥锁能否够用,不会堵塞。
线程1或者2占有mt的时间为10秒。
linux run
xx@h10-1-152-72:~/peteryfren/cpp/pthread> gcc -Wall -o pt_lock pt_lock.c -lpthread
xx@h10-1-152-72:~/peteryfren/cpp/pthread> ./pt_lock
输出结果与预期一致,id=1082132800线程先占有mt。10s内线程tid=1090525504堵塞,而线程tid=1098918208每隔1s測试下mt可用性。
want to lock mutex, msg=block, tid=1082132800
I[tid=1082132800] am using, (*|^_^|*)
want to lock mutex, msg=block, tid=1090525504
after sleep 1s, i [tid=1098918208] want to try again, iter=1.
after sleep 1s, i [tid=1098918208] want to try again, iter=2.
after sleep 1s, i [tid=1098918208] want to try again, iter=3.
after sleep 1s, i [tid=1098918208] want to try again, iter=4.
after sleep 1s, i [tid=1098918208] want to try again, iter=5.
after sleep 1s, i [tid=1098918208] want to try again, iter=6.
after sleep 1s, i [tid=1098918208] want to try again, iter=7.
after sleep 1s, i [tid=1098918208] want to try again, iter=8.
I[tid=1090525504] am using, (*|^_^|*)
after sleep 1s, i [tid=1098918208] want to try again, iter=9.
after sleep 1s, i [tid=1098918208] want to try again, iter=10.
after sleep 1s, i [tid=1098918208] want to try again, iter=11.
after sleep 1s, i [tid=1098918208] want to try again, iter=12.
after sleep 1s, i [tid=1098918208] want to try again, iter=13.
after sleep 1s, i [tid=1098918208] want to try again, iter=14.
after sleep 1s, i [tid=1098918208] want to try again, iter=15.
after sleep 1s, i [tid=1098918208] want to try again, iter=16.
after sleep 1s, i [tid=1098918208] want to try again, iter=17.
after sleep 1s, i [tid=1098918208] want to try again, iter=18.
after sleep 1s, i [tid=1098918208] want to try again, iter=19.
It is my[tid=1098918208] turn, so long i waited...msg=unblock
android run
@echo "1. build .o file" @Rem fPIE flag is used in compiling stage.
D:\android-ndk-r9b-windows-x86\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc.exe --sysroot=D:\android-ndk-r9b-windows-x86\platforms\android-13\arch-arm -fPIE -c pt_lock.c @echo "2. build exec file" @Rem pie flag is used in linking stage.
D:\android-ndk-r9b-windows-x86\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-gcc.exe --sysroot=D:\android-ndk-r9b-windows-x86\platforms\android-13\arch-arm -pie -o pt_lock pt_lock.o @pause
里面的gcc和android系统库路径须要依据机器上实际位置改动。
android-ndk-r9b-windows-x86\platforms\android-13\arch-arm\usr\lib文件夹下的这些so载入须要指定。。在Android.mk中类似。
E:\GitHub\ndk_tutorial\pthread_playground>adb shell
root@mako:/ # cd /data/local/tmp
cd /data/local/tmp
root@mako:/data/local/tmp # mv /sdcard/pt_lock ./
mv /sdcard/pt_lock ./
root@mako:/data/local/tmp # chmod 751 pt_lock
chmod 751 pt_lock
root@mako:/data/local/tmp # ./pt_lock
error: only position independent executables (PIE) are supported.
报了PIE不支持的错误,n4上安装的是android L系统。gg后知道编译的链接的须要添加pie等设置,參见[ref2],fPIE是编译时候的选项,pie是链接时候的选项。再次又一次编译,推到手机上执行OK。。。pt_lock.c不须要做不论什么改动。
pthread学习
- 回调函数执行完毕。正常退出
- 线程内调用pthread_exit函数。无论是否完毕都退出。该函数后面的全部代码都不会被执行(尤其printf等语句)。
- 其它线程显式调用pthread_cancel 结束当前线程。
- 整个进程被终止,由于调用了exit等函数。它以下的全部线程都被杀死。资源被回收。
- main函数创建N个线程。两种做法等待其它线程结束:显式pthread_join等待其它线程结束;main函数中调用pthread_exit,等待其它线程结束。
相关的讨论參见:http://a-shi.org/blog/2012/07/27/pthread_cond_wait_mutex_while/
refer
1. gcc以下的pie和fPIE 选项标志解说,http://richardustc.github.io/blog/2013/05/pie/
2. android L系统下PIE错误,http://blog.csdn.net/hxdanya/article/details/39371759
3. pthread http://man7.org/linux/man-pages/man3/pthread_create.3.html
linux和android端的pthread学习的更多相关文章
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)
简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着,在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)一文中举例子说明了如何在 ...
- webrtc学习笔记2(Android端demo代码结构)
最近正在修改webrtc的Android端demo和服务器交互的内容,介绍一下demo的大体结构吧,以便能快速回忆. 环境:Android5.0以上.libjingle_peerconnection_ ...
- Ionic3学习笔记(九)关于 Android 端软键盘弹出后界面被压缩的问题
本文为原创文章,转载请标明出处 今天做了一个如下图所示的页面. iOS 端毫无 bug,Android 端却出现了问题.当软键盘弹出后,Android 端的 tabs 移到了软键盘的上面,再仔细一看, ...
- Ionic3学习笔记(八)使iOS端、Android端 Navbar 透明化
本文为原创文章,转载请标明出处 若要使iOS端 Navbar 透明,只需要给 ion-navbar 添加 transparent 属性,但是Android端依旧会有一条border在,所以再给 ion ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- 浅谈 unix, linux, ios, android 区别和联系
浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux UNIX 操作系统(尤尼斯) ...
- Android(java)学习笔记103:Framework运行环境之 Android进程产生过程
1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- 【Android端APP 安装包检查】安装包检查具体内容及实现方法
一.安装包检查的具体包含内容有哪些? 1.安装包检查的一般内容包括: 安装包基本信息检查: 文件大小: xx MB 包名: com.xx 名称: xx 本次安装包证书与外网证书对比一致性:是 版本号 ...
随机推荐
- tomcat中server.xml配置详解(转载)(一)
转载自:https://www.cnblogs.com/starhu/p/5599773.html tomcat中server.xml配置详解 Tomcat Server的结构图如下:(该文件描述了如 ...
- js知识梳理1:理解对象的属性特性
1.数据属性 数据属性的4个特性: Configurable:①表示能否通过delete删除属性从而重新定义,②能否修改属性的特性,③能否把属性修改为访问器属性.对象直接量里默认值true. Enum ...
- Java 中equals和==差别
java中的数据类型,可分为两类: 1.基本数据类型.也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比較,应用双等号( ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- H5 Canvas | 画布中变量作用域与setInterval方法同步执行探究
Demo - 随机绘制圆环 实现思路: 将一个圆环的绘制分成100份,setInterval()方法定义每隔时间n绘制一段新的,每份的开始路径都是上一次的结束路径,实现步进绘制. 通过Math.ran ...
- mybatis学习知识
目录 1,目录 2,介绍 3,快速入门 4,配置XML 5,xml文件映射 6,动态sql 7,java api 8,Statement Builders 9,日志 1,介绍 1.1 介绍 1.1.1 ...
- 阿里云web播放器
原文地址:https://help.aliyun.com/document_detail/51991.html?spm=5176.doc61109.6.703.ZTCYoi 一.概念说明 1. pla ...
- Java Annotations, Java Reflection, and Java Test Runner
www.vogella.com/tutorials/JavaAnnotations/article.html
- mysql 一些常用指令
登陆: mysql -u root -p //登陆,输入root密码 退出登陆 mysql>exit; mysql 为所有ip授权 mysql> GRANT ALL PRIVILEGES ...
- flink checkpoint 源码分析 (二)
转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...