pthread

lock和wait+signal

送分小仙女□ 提交于 2020-03-02 02:38:00
lock和wait+signal 在编程中,我们经常使用多线程来提升性能,所以这就涉及到 互斥和同步 的问题了。而在编程中,我们一般都是通过如下方式来完成多线程的互斥和同步: lock | unlock signal + wait(timeout) join sleep C语言 在Linux C编程中,我们通常使用 pthread 类库来完成跨平台的多线程控制,如下是几个常用的API: pthread_mutex_lock():占有互斥锁(阻塞操作) pthread_mutex_unlock(): 释放互斥锁 pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程 pthread_cond_wait(): 等待条件变量的特殊条件发生 pthread_cond_timedwait():等待条件变量的特殊条件发生或者timeout pthread_join():阻塞当前的线程,直到另外一个线程运行结束 sleep() : 休眠固定时间, 不过这个API是Linux原生提供,不能跨平台。 注意:**pthread类库是glibc(绝大多数Linux平台标准C库。)的一部分。这些功能都是通过中断号进入内核来完成的,而非仅仅做了Linux兼容API。**具体可见 glibc-2.23\sysdeps\nacl\nacl

线程之线程同步

风流意气都作罢 提交于 2020-03-01 12:51:01
本文来自个人博客: https://dunkwan.cn 文章目录 线程同步 互斥量 函数`pthread_mutex_timedlock` 读写锁 带有超时的读写锁 条件变量 自旋锁 屏障 线程同步 互斥量 互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行设置,在访问完成后释放互斥量。互斥量使用 pthread_mutex_t 数据类型表示的。在使用互斥量以前,必须首先对它进行初始化,可以把它设置为常量 PTHREAD_MUTEX_INITIALIZER (只适用于静态分配的互斥量),也可以通过调用 pthread_mutex_init 函数进行初始化。如果动态分配互斥量(例如通过调用 malloc 函数),在释放内存前需要调用 pthread_mutex_detroy 。 # include <pthread.h> int pthread_mutex_init ( pthread_mutex_t * restrict mutex , const pthread_mutexattr_t * restrict attr ) ; int pthread_mutex_destroy ( pthread_mutex_t * mutex ) ; 两个函数的返回值:若成功,返回 0 ;否则,返回错误编号。 要用默认的属性初始化互斥量,只需把 attr 设为 NULL 。

Android深入浅出之Binder机制

旧城冷巷雨未停 提交于 2020-02-29 17:07:08
Android 深入浅出之 Binder 机制 一 说明 Android 系统最常见也是初学者最难搞明白的就是 Binder 了,很多很多的 Service 就是通过 Binder 机制来和客户端通讯交互的。所以搞明白 Binder 的话,在很大程度上就能理解程序运行的流程。 我们这里将以 MediaService 的例子来分析 Binder 的使用: <!--[if !supportLists]--> l <!--[endif]--> ServiceManager ,这是 Android OS 的整个服务的管理程序 <!--[if !supportLists]--> l <!--[endif]--> MediaService ,这个程序里边注册了提供媒体播放的服务程序 MediaPlayerService ,我们最后只分析这个 <!--[if !supportLists]--> l <!--[endif]--> MediaPlayerClient ,这个是与 MediaPlayerService 交互的客户端程序 下面先讲讲 MediaService 应用程序。 二 MediaService 的诞生 MediaService 是一个应用程序,虽然 Android 搞了七七八八的 JAVA 之类的东西,但是在本质上,它还是一个完整的 Linux 操作系统

pthread_create

妖精的绣舞 提交于 2020-02-29 11:22:16
1函数简介 头文件 #include<pthread.h> 函数声明 intpthread_create(pthread_t*tidp,constpthread_attr_t*attr, (void*)(*start_rtn)(void*),void*arg); 返回值 若线程创建成功,则返回0。若线程创建失败,则返回出错编号,并且*thread中的内容是未定义的。[1] 返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。 新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函 数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。 linux下用C语言开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时, 才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的 指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译 器能通过作出 restrict

Android深入浅出之Binder机制

て烟熏妆下的殇ゞ 提交于 2020-02-28 22:04:31
Android 深入浅出之 Binder 机制 一 说明 Android 系统最常见也是初学者最难搞明白的就是 Binder 了,很多很多的 Service 就是通过 Binder 机制来和客户端通讯交互的。所以搞明白 Binder 的话,在很大程度上就能理解程序运行的流程。 我们这里将以 MediaService 的例子来分析 Binder 的使用: l ServiceManager ,这是 Android OS 的整个服务的管理程序 l MediaService ,这个程序里边注册了提供媒体播放的服务程序 MediaPlayerService ,我们最后只分析这个 l MediaPlayerClient ,这个是与 MediaPlayerService 交互的客户端程序 下面先讲讲 MediaService 应用程序。 二 MediaService 的诞生 MediaService 是一个应用程序,虽然 Android 搞了七七八八的 JAVA 之类的东西,但是在本质上,它还是一个完整的 Linux 操作系统,也还没有牛到什么应用程序都是 JAVA 写。所以, MS(MediaService) 就是一个和普通的 C++ 应用程序一样的东西。 MediaService 的源码文件在: framework\base\Media\MediaServer\Main

线程之线程标识、创建以及终止

為{幸葍}努か 提交于 2020-02-28 19:14:29
本文来自个人博客: https://dunkwan.cn 文章目录 线程标识 线程创建 线程终止 线程标识 就像每个进程有一个进程ID一样,每个线程也都有自己的线程ID。进程ID在整个系统中是唯一的,但线程ID不同,线程ID不同,线程ID只有在它所属的进程上下文中才有意义。 线程ID是由 pthread_t 数据类型来表示的,实现的时候可以用一个结构来代表 pthread_t 数据类型,所以可移植的操作系统实现不能把它作为整数处理。因此必须使用一个函数来对两个线程ID进行比较。 # include <pthread.h> int pthread_equal ( pthread_t tid1 , pthread_t tid2 ) ; 返回值:若相等,返回非 0 数值;否则,返回 0 。 Linux 3.2.0使用无符号长整型表示 pthread_t 数据类型。 Mac OS X 10.6.8 使用一个指向 pthread 结构的指针来表示 pthread_t 数据类型。 pthread_self 函数用于获取自身的线程ID。 # include <pthread.h> pthread_t pthread_self ( void ) ; 返回值:调用线程的线程ID。 线程创建 传统UNIX进程模型中,每个进程只有一个控制线程。从概念上讲

理解Android线程创建流程

百般思念 提交于 2020-02-27 17:35:41
copy from : http://gityuan.com/2016/09/24/android-thread/ 基于Android 6.0源码剖析,分析Android线程的创建过程 /android/libcore/libart/src/main/java/java/lang/Thread.java /art/runtime/native/java_lang_Thread.cc /art/runtime/native/java_lang_Object.cc /art/runtime/thread.cc /system/core/libutils/Threads.cpp /system/core/include/utils/AndroidThreads.h /frameworks/base/core/jni/AndroidRuntime.cpp 一.概述 Android平台上的Java线程,就是Android虚拟机线程,而虚拟机线程由是通过系统调用而创建的Linux线程。纯粹的Linux线程与虚拟机线程的区别在于虚拟机线程具有运行Java代码的Runtime. 除了虚拟机线程,还有Native线程,对于Native线程有分为是否具有访问Java代码的两类线程。接下来,本文分析介绍这3类线程的创建过程。 二. Java线程 2.1 Thread.start [-> Thread

linux 安装python MySQLdb

安稳与你 提交于 2020-02-27 07:56:14
转自: https://my.oschina.net/jywm/blog/757973 安装步骤 在服务器安装了mysql 或者mysql-connect的前提下 1、安装setuptools 2、安装mysql-python 1、No module named setuptools *原因 没有安装setuptools工具 *解决方案 在python官网 https://pypi.python.org搜 setuptools工具,复制工具连接,然后如下操作 #wget https://pypi.python.org/packages/6b/dd/a7de8caeeffab76bacf56972b3f090c12e0ae6932245abbce706690a6436/setuptools-2#md5=a46750b6bd90a1343466bd57b0e2721a #tar -zxvf setuptools-28.3.0.tar.gz #python setup.py build #python setup.py install 2、mysql_config找不到 *现象 [root@4342116e3cd9 MySQL-python-1.2.5]# python setup.py build sh: mysql_config: command not found

c 读写锁 -demo

北城以北 提交于 2020-02-27 01:45:25
#include <pthread.h> #include <stdio.h> #include <unistd.h> void readFunc(); void writeFunc(); int data = 0; pthread_rwlock_t rwlock; int main() { pthread_rwlock_init(&rwlock, NULL); pthread_t readThread; pthread_t writeThread; pthread_t readThread1; pthread_create(&readThread, NULL, readFunc, NULL); pthread_create(&writeThread, NULL, writeFunc, NULL); pthread_create(&readThread1, NULL, readFunc, NULL); pthread_join(readThread, NULL); pthread_join(writeThread, NULL); pthread_join(readThread1, NULL); pthread_rwlock_destroy(&rwlock); return 0; } void readFunc() { while (1) { pthread_rwlock

pthread_testcancel用法简介

眉间皱痕 提交于 2020-02-26 15:18:23
文章目录 pthread_testcancel用法简解 pthread_testcancel用法简解 某些情况下,希望通过pthread_cancel结束某个线程,但是被结束的线程必须在某一个点来进行退出操作,就需要用到pthread_testcancel。 示例代码如下 #include <pthread.h> #include <iostream> #include <unistd.h> using std::endl; using std::cout; void* test_cannel(void* arg) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL); while(true) { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL); cout << "1" << endl; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; cout << "5" << endl; cout << "6" << endl; cout << "7" << endl; pthread