pthread

pthread_mutex_t

夙愿已清 提交于 2020-02-07 03:30:24
在Linux中使用线程 http://blog.csdn.net/jiajun2001/article/details/12624923 :LINUX就是这个范围作者 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责 我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下。如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级。 首先说明一下,在Linux编写多线程程序需要包含头文件pthread.h。也就是说你在任何采用多线程设计的程序中都会看到类似这样的代码: [cpp] view plain copy #include <pthread.h> 当然,进包含一个头文件是不能搞定线程的,还需要连接libpthread.so这个库,因此在程序连接阶段应该有类似这样的指令: gcc program.o -o program -lpthread 1. 第一个例子 在Linux下创建的线程的API接口是pthread_create(),它的完整定义是: [cpp] view plain copy int pthread_create(pthread_t * thread, const pthread_attr_t *attr, void *(*start_routine)( void*) void *arg)

pthread_mutex_lock

老子叫甜甜 提交于 2020-02-07 03:20:16
#include <pthread.h> #include <unistd.h> #include <string.h> #include <iostream> static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; struct node { int n_number; struct node *n_next; } *head = NULL; /*[thread_func]*/ static void cleanup_handler(void *arg) { printf("Cleanup handler of second thread./n"); free(arg); (void)pthread_mutex_unlock(&mtx); } static void *thread_func(void *arg) { struct node *p = NULL; pthread_cleanup_push(cleanup_handler, p); while (1) { pthread_mutex_lock(&mtx); while (head == NULL) { pthread_cond_wait(&cond,

arm交叉编译opencv-2.4.9的步骤以及出现的问题

[亡魂溺海] 提交于 2020-02-04 03:23:06
linux环境:ubuntu16.04 交叉编译工具 arm-cortexa9-linux-gnueabi (一)下载opencv2.4.9源码 下载地址: opencv (二)配置编译环境 安装cmake cmake-qt-gui (三)配置编译选项 打开cmake-gui 配置编译选项 Compilers选项中的C选择*-gcc C++选择*-g++,要找到交叉编译工具链所在位置。 find program include 编译工具的库函数(lib)的位置 点Advanced 接下来是终极配置!!不按照以下配置必然会报错!! 去掉BUILD_OPENEXR 去掉BUILD_opencv_ocl 去掉WITH_1394 去掉WITH_CUDA 去掉WITH_GSTREAMER(没见到) 去掉WITH_GTK(没见到) 去掉WITH_LIBV4L(后边有v4l这个没用不要选)(没见到) 去掉WITH_OPENCL 去掉WITH_OPENEXR 去掉WITH_TIFF 在cmake-gui中去掉BUILD_opencv_apps这一项的钩钩!!! 勾上BUILD_JASPER 勾上BUILD_JPEG 勾上BUILD_PNG 勾上BUILD_ZLIB CMAKE_C_FLAGS 设置为-O3 -fPIC CMAKE_CXX_FLAGS 设置为-O3 -fPIC CMAKE

6.2、线程控制的相关函数

旧城冷巷雨未停 提交于 2020-02-02 03:44:37
1、pthread_create函数 创建一个新线程。作用,对应进程中 fork ( ) 函数。 int pthread_create ( pthread_t * thread , const pthread_attr_t * attr , void * ( * start_routine ) ( void * ) , void * arg ) ; 返回值:成功: 0 ;失败:错误号 -- -- - Linux环境下,所有线程特点,失败均直接返回错误号。 参数: pthread_t:当前Linux中可理解为: typedef unsigned long int pthread_t ; 参数 1 :传出参数,保存系统为我们分配好的线程ID 参数 2 :通常传 NULL ,表示使用线程默认属性。若想使用具体属性也可以修改该参数。 参数 3 :函数指针,指向线程主函数 ( 线程体 ) ,该函数运行结束,则线程结束。 参数 4 :线程主函数执行期间所使用的参数。 attr参数表示线程属性,暂不讨论线程属性,先传 NULL 给attr参数,表示线程属性取缺省值,可参考APUE。 2、pthread_exit函数 将单个线程退出 void pthread_exit ( void * retval ) ; 参数:retval表示线程退出状态,通常传 NULL 线程中,禁止使用exit函数

pthread_mutex_timedlock使用的误解

拥有回忆 提交于 2020-02-01 18:01:34
在使用pthread_mutex_timedlock时,由于错误理解,导致并没有产生想要的效果。这里记录下:   先用pthread_mutex_lock进入锁,再用pthread_mutex_timedlock进入锁,结果发现第二次超时并没有其效果。 代码模拟如下: 1 #include <string.h> 2 #include <pthread.h> 3 #include <stdio.h> 4 #include <time.h> 5 uint64_t CTime::getCurrentMilliSecond() 6 { 7 struct timespec tp; 8 if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) 9 { 10 uint64_t ms = (uint64_t)1000 * tp.tv_sec + tp.tv_nsec / 1000000; 11 return ms; 12 } 13 return 0; 14 } 15 int main(void) 16 { 17 int err; 18 struct timespec tout; //纳秒级别 19 struct tm *tmp; 20 char buf[64]; 21 22 pthread_mutex_t lock; 23 pthread_mutex_init(

条件锁(条件Mutex)pthread_cond_wait、pthread_cond_signal、pthread_cond_broadcast的使用

梦想与她 提交于 2020-01-31 03:17:33
LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数。但这个函数的执行过程比较难于理解。 pthread_cond_wait()的工作流程如下(以MAN中的EXAMPLE为例): Consider two shared variables x and y, protected by the mutex mut, and a condition vari- able cond that is to be signaled whenever x becomes greater than y. int x,y; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; Waiting until x is greater than y is performed as follows: pthread_mutex_lock(&mut); while (x <= y) { pthread_cond_wait(&cond, &mut); } /* operate on x and y */ pthread_mutex_unlock(&mut); Modifications on x and y

Linux c 条件变量cond的使用记录

蹲街弑〆低调 提交于 2020-01-31 03:16:45
  条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的“原子性”。 1、创建一个条件变量cond: int pthread_cond_init(pthread_cond_t * cond , const pthread_condattr_t * attr ); 在初始化一个条件变量时如果attr为 NULL,测使用默认值初始化一个条件变量cond,相当于下面的方式定义一个条件变量cond; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 2、销毁一个条件变量cond: int pthread_cond_destroy(pthread_cond_t * cond ); 可以销毁一个条件变量cond,使其未初始化。一个被引用的条件变量是不可被销毁的,使用一个被销毁的条件变量将造成为止的后果,在默认条件下测试,将导致线程将直处于阻塞状态。 3、等待一个条件变量: int pthread_cond_timedwait(pthread_cond_t * cond ,pthread_mutex_t * mutex , const struct timespec *restrict abstime ); int

Linux线程互斥(线程安全)

僤鯓⒐⒋嵵緔 提交于 2020-01-31 03:15:18
线程安全 线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 简单点来说: 因为多线程为一个进程下的多个执行流, 那么久意味着这些线程都共用同一份虚拟地址空间, 这样以来个个线程之间就会有很多数据是共享的 , 比如全局数据, 堆上的内存, 而如果多个线程同时操作一个这样的资源, 那么就会出现不可预知的结果, 比如如下的抢票程序 可以看一下的实例: # include <iostream> # include <pthread.h> # include <stdio.h> # include <stdlib.h> # include <unistd.h> using namespace std ; int ticket = 100 ; //thread_mutex_t mutexs; void * TekeTi ( void * agr ) { while ( 1 ) { // pthread_mutex_lock(&mutexs); if ( ticket > 0 ) { printf ( "我抢到%d,我是线程%ld\n" , ticket , ( long ) agr ) ; ticket -- ; usleep ( 10 ) ; //

pthread_join/pthread_exit用法实例

耗尽温柔 提交于 2020-01-29 05:27:24
函数pthread_join用来等待一个线程的结束。函数原型为:   extern int pthread_join __P ((pthread_t __th, void **__thread_return));   第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的线程将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:   extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));   唯一的参数是函数的返回代码,只要pthread_exit中的参数retval不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。 实例: /*myfile11-3.c*/ #include <stdio.h> #include <pthread.h> #include <stdlib.h>

Linux 线程同步

孤街浪徒 提交于 2020-01-28 02:57:30
1. 互斥量, 静态初始化:PTHREAD_MUTEX_INITIALIZER int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) ini pthread_mutex_destory(phread_mutex_t * mutex) int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_trylock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) 2. 读写锁 int pthread_rwlock_init(pthread_rwlock_t * rwlock, const pthread_rwlockattr_t * attr); int pthread_rwlock_destroy(pthread_rwlock_t * rwlock) int pthread_rwlock_rdlock(pthread_rwlock_t * rwlock) int pthread_rwlock_wrlock(pthread_rwlock_t * rwlock) int pthread_rwlock_unlock