Linux同步拾遗

原创 2011年01月10日 22:01:00

一般情况下,线程在主题函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止请求而强制终止。
线程取消的方法是向目标线程发cancel信号,但如何处理cancel信号则由目标线程自己决定,或者忽略,或者立即终止,或者继续运行到cancelation-point(取消点),由不同cancelation状态决定。
线程收到cancel信号的却醒处理是继续运行到取消点,也就是设置一个CANCELED状态,线程继续运行,只有运行到cancelation-point的时候才会退出。
根据POSIX标准,pthread_join,pthread_testcancel,pthread_cond_wait,pthread_cond_timedwait,sem_wait,sigwait以及read,write等会引起足赛的系统带哦用都是取消点,而其他pthread函数都不会引起cancelation动作。但是pthread_cancel的手册声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但Cancel信号会使线程从足赛的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标。
如果线程处于无限循环中,且循环体内没有执行至取消点的必然路径,则线程无法由外部其他线程的取消请求而终止,因此在这样的循环体的必经路径上应该加入pthread_testcancel()调用。
与线程取消有关的pthread函数:
int pthread_cancel(pthread_t thread);
发送终止信号给线程,如果成功则返回0,否则非0。
int pthread_setcancelstate(int state, int *oldstate)
设置本线程对cancel信号的反应。
int pthread_setcanceltype(int type, int* oldtype)
设置本县成取消动作的执行实际,type由两种趣旨:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYNCHRONOUS,仅当cancel状态为enable时,分表表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出)。
void pthread_testcancel()
检查本县成是否处于cancel状态,如果是,则进行取消动作。

pthread_join用来等待一个线程的结束。函数原型为:
extern int pthread_join __P(pthread_t __th, void** __thread_return);
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它用来存储线程返回值。这个函数是一个足赛函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被回收。在Linux中默认情况下在一个线程被创建后必须使用此函数对创建的线程进行资源回收,但是可以设置ThreadAttributes来设置当一个线程结束时直接回收此线程占用的系统资源。

Linux还有为线程在取消点退出而准备的pthread_cleanup_push,pthread_cleanup_pop。

pthread_cond_wait()函数一进入wait状态就会自动release mutex.
pthread_cond_wait()函数一旦wait成功获得cond条件的时候就会自动lock mutex.

一个经典的cond_wait/broadcast使用:
pthread_mutex_lock(&mut);
while (x <= y) {
  pthread_cond_wait(&cond, &mut);
}
/* modifies on x and y */
pthread_mutex_unlock(&mut);

pthread_mutex_lock(&mut);
if (x > y) pthread_cond_signal(&cond);
pthread_mutex_unlock(&mut);
表面上signal只唤醒第一个线程,broadcast唤醒全部线程,但是pthread_cond_signal在多处理器上可能同时唤醒多个线程。
至于为什么被唤醒之后还要再次进行条件判断(即为什么要使用while循环来判断条件),是因为可能有惊群现象。

自旋锁是为实现保护共享资源而提出的一种锁机制,与互斥锁不同,它会先循环等待锁是否已经释放,一般来说,自旋锁有一个参数限定最多持续尝试次数,超出后,自动放弃当前time slice,等下一次机会。自选所比较适用于锁保持着保持锁比较短的情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Linux同步拾遗

一般情况下,线程在主题函数退出的时候会自动终止,但同时也可以因为接收到另一个线程发来的终止请求而强制终止。 线程取消的方法是向目标线程发cancel信号,但如何处理cancel信号则由目标线程自己决...

Linux拾遗

/dev/null 2>&1 0 标准输入 1 标准输出 2 标准出错输出 >/dev/null 是将执行结果屏蔽 2>&1 是将标准输出和标准出错一起重定向到一个文件中 ----------...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【转载】java拾遗

public class SimpleBeanOne{ public static void main(String[] args){ String str1 = "hello"; String st...

Linux 问题解决拾遗

1, Ubuntu更换镜像源: vim /etc/apt/sources.list 修改里面内容,例如换成阿里源: deb http://mirrors.aliyun.com/ubunt...

linux 知识点拾遗

在 Linux 底下,每一个档案或目录的文件名最长可以到达 255 的字符,加上完整路径时, 最长可达 4096 个字符

Linux(Ubuntu)命令拾遗

Linux下的命令记录,持续记载Ubuntu更换镜像源:vim /etc/apt/sources.list修改里面内容,例如换成阿里源:deb http://mirrors.aliyun.com/ub...

Java static——拾遗

Java static——拾遗 Java Static:作为修饰符, 可以用来修饰变量、方法、代码块(但绝对不能修饰类)。 1、修饰变量: 类的所有对象共同拥有的一个属性,也称为类变量。这类似于C...

javascript拾遗

1、name和id的区别?id是html标签的标识符,有唯一性,一般用来javascript的引用。name也是html标签的标识符,不是唯一的,name有id不可替代的地方。包括: 用途1: 作为...

C++拾遗

一些平常要用到的容易疏漏的地方。 1、类的静态函数不能访问非静态数据; 原因:因为静态成员函数不传递this指针, 不和具体实例关联, 所以不能访问非静态member, 多用于callback。 ...

JAVA拾遗录

本系列博文主要收录Java中一些常见的但是平常又容易忘记、记错或者记混的知识点的集合。各个知识点之间没有必然的联系,可以随意跳着看,希望能够对各位同学有所帮助。 本博文持续更新、修改,转载请保留原文...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)