pthread

线程同步之互斥量

你说的曾经没有我的故事 提交于 2020-04-07 11:53:29
操作系统编程--线程同步问题 生产者和消费者问题 互斥量是最简单的线程同步的方法 互斥量(互斥锁),处于两态之一的变量:解锁和加锁 两个状态可以保证资源访问的串行 操作系统直接提供了互斥量的API 开发者可以直接使用API完成资源的加锁、解锁操作 具体操作 ◆ pthread_mutex_t //用于定义线程互斥锁对象 ◆ pthread_mutex_lock(&mutex) //上锁操作 ◆ pthread_mutex_unlock(&mutex) //开锁操作 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <vector> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int num = 0; void *producer(void*){ int times = 10000000; while(times --){ //不加锁操作则会导致出现共享资源不统一问题 即num 最后不为0 pthread_mutex_lock(&mutex); num += 1; pthread_mutex_unlock(&mutex); } } void *comsumer(void*){ int times =

线程之线程终止

ε祈祈猫儿з 提交于 2020-04-07 10:18:19
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。 单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1)线程只是从启动例程中返回,返回值是线程的退出码。 (2)线程可以被同一进程中的其他线程取消。 (3)线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。 #include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); 返回值:若成功则返回0,否则返回错误编号 调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。 可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread

Linux线程基础函数

主宰稳场 提交于 2020-04-07 10:17:58
1. 线程标识: (1) 比较两个线程ID; #include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ret-若相等则返回非0值,否则返回0值 (2) 获取线程自身ID; #include <pthread.h> pthread_t pthread_self(void); ret-调用线程的线程ID 2. 线程的创建: #include <pthread.h> int pthread_create(pthread_t *restrict tidp, //返回线程的ID           const pthread_attr_t *restrict attr, //线程属性,默认为NULL void *(*start_rtn)(void), //线程函数入口地址 void *restrict arg); //参数 ret-成功返回0 失败返回错误编号 3. 线程的终止: (1) 线程只是从启动例程中返回,返回值是线程的退出码; (2) 线程可以被同一例程中的其他线程取消; (3) 线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传递给启动例程的单个参数类似

如何查看一个进程中的某个线程是否存活?

风格不统一 提交于 2020-04-07 10:17:40
pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。 int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。 pthread_kill(threadid, SIGKILL)也一样,杀死整个进程。 如果要获得正确的行为,就需要在线程内实现signal(SIGKILL,sig_handler)了。 所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,否则,就会影响整个进程。 OK,如果int sig是0呢,这是一个保留信号,一个作用是用来判断线程是不是还活着。 我们来看一下pthread_kill的返回值: 成功:0 线程不存在:ESRCH 信号不合法:EINVAL 所以,pthread_kill(threadid,0)就很有用啦。 int kill_rc = pthread_kill(thread_id,0); if(kill_rc =

C++单例模式

有些话、适合烂在心里 提交于 2020-04-06 02:37:05
单例模式是任何面向对象语言绕不过的,单例模式是很有必要的,接下来我用最朴素的语言来解释和记录单例模式的学习。 什么是单例模式? 单例模式就是一个类只能被实例化一次 ,更准确的说是 只能有一个实例化的对象的类。 创建一个单例模式的类(初想) 一个类只能有一个实例化的对象,那么这个类就要禁止别人new出来,或者通过直接定义一个对象出来 class CAR { public: CAR(){} ~CAR(){} }; CAR a; CAR *b = new CAR; 很明显这样的类可以被程序员用上面这两种方式实例化。那么考虑,如何禁止用上面的这两种方式实例化一个类呢? 如果把构造函数私有化,很明显上面这两种方法都会默认的去调用构造函数,当构造函数是private或者protected时,构造函数将无法从外部调用。 class CSingleton { private: CSingleton() { } }; int main() { CSingleton t; CSingleton *tt = new CSingleton; } 上面的代码选择了这样实例化类,很明显编译器会报错,因为私有化的构造函数无法被外部调用 error: ‘CSingleton::CSingleton()’ is private 既然构造函数是私有了,那么他就只能被类内部的成员函数调用

Spin lock 与mutex 的区别--2011.01.06

ぃ、小莉子 提交于 2020-03-28 05:12:28
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。 Pthreads提供了多种锁机制: (1) Mutex(互斥量):pthread_mutex_*** (2) Spin lock(自旋锁):pthread_spin_*** (3) Condition Variable(条件变量):pthread_con_*** (4) Read/Write lock(读写锁):pthread_rwlock_*** Pthreads提供的Mutex锁操作相关的API主要有: pthread_mutex_lock (pthread_mutex_t *mutex); pthread_mutex_trylock (pthread_mutex_t *mutex); pthread_mutex_unlock (pthread_mutex_t *mutex); Pthreads提供的与Spin Lock锁操作相关的API主要有: pthread_spin_lock (pthread_spinlock_t

Spin lock 与mutex 的区别

可紊 提交于 2020-03-28 05:09:59
转自http://blog.csdn.net/kyokowl/article/details/6294341 POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。 Pthreads提供了多种锁机制: (1) Mutex(互斥量):pthread_mutex_*** (2) Spin lock(自旋锁):pthread_spin_*** (3) Condition Variable(条件变量):pthread_con_*** (4) Read/Write lock(读写锁):pthread_rwlock_*** Pthreads提供的Mutex锁操作相关的API主要有: pthread_mutex_lock (pthread_mutex_t *mutex); pthread_mutex_trylock (pthread_mutex_t *mutex); pthread_mutex_unlock (pthread_mutex_t *mutex); Pthreads提供的与Spin

linux下多线程编程

我只是一个虾纸丫 提交于 2020-03-27 23:01:10
先看执行的结果: 1 主函数正在创建线程,... 2 线程1被创建 3 Thread1 : I'm thread 1th 4 线程2被创建 5 Thread2 : I'm thread 2nd 6 thread2 : number = 0 7 线程3被创建 8 主函数正在等待线程结束... 9 thread1 : number = 0 10 Thread3 : I'm thread 3nd 11 thread3 : number = 2 12 thread3 : number = 3 13 thread2 : number = 4 14 thread1 : number = 5 15 thread3 : number = 6 16 thread2 : number = 7 17 thread3 : number = 8 18 thread1 : number = 9 19 thread3 : number = 10 20 thread2 : number = 11 21 thread3 : number = 12 22 thread2 : number = 13 23 thread1 : number = 14 24 thread3 : number = 15 25 thread3 : number = 16 26 thread2 : number = 17 27 thread1

slot signal机制

强颜欢笑 提交于 2020-03-23 12:09:35
有一个比较 经典的实现: http:// sigslot.sourceforge.net / 很精简的 signal slot的实现,跨平台。webrtc项目在用,我在自己项目里也用了。 这个源码有2000多行,但是一大半是为了模板适配不同个数的参数的代码,干货不足1000行。 附上代码链接,这个项目只有一个头文件,够小型了吧 http:// sigslot.cvs.sourceforge.net /viewvc/sigslot/sigslot/sigslot.h?revision=1.1.1.1&content-type=text%2Fplain Gtalk源码剖析之:sigslot介绍 源码: // sigslot.h: Signal/Slot classes // // Written by Sarah Thompson (sarah@telergy.com) 2002. // // License: Public domain. You are free to use this code however you like, with the proviso that // the author takes on no responsibility or liability for any use. // // QUICK DOCUMENTATION // // (see

Linux 多线程通信

耗尽温柔 提交于 2020-03-23 02:40:21
摘自资料(linux 与Windows不同) 线程间无需特别的手段进行通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同一时候使用。只是要注意的是线程间须要做好同步,一般用mutex。能够參考一些比較新的UNIX/Linux编程的书,都会提到Posix线程编程,比方《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通信,线程用不上。 linux用pthread_kill对线程发信号。 另:windows下不是用post..(你是说PostMessage吗?)进行线程通信的吧? windows用PostThreadMessage进行线程间通信,但实际上极少用这样的方法。还是利用同步多一些 LINUX下的同步和Windows原理都是一样的。只是Linux下的singal中断也非常好用。 用好信号量,共享资源就能够了。 使用多线程的理由之中的一个是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而执行于一个进程中的多个线程,它们彼此之间使用同样的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,并且