Linux多线程编程
- 格式:pdf
- 大小:452.34 KB
- 文档页数:44
线程的撤销(续)
z z z z z z z z z z z z z z z z z z z z z z z
void* thread2(void *arg) { int i = 0; printf("thread2 sends cancelation request to thread1\n"); /* 向线程 thread1 发送撤销请求 */ pthread_cancel(pt[0]); printf("thread2 ends\n"); pthread_exit(NULL); } int main(int argc, char *argv[]) { int i; int ret_val; ret_val = pthread_create(&pt[0], NULL, thread1, NULL); if (ret_val != 0 ) { printf("pthread_create error!\n"); exit(1); } ret_val = pthread_create(&pt[1], NULL, thread2, NULL); if (ret_val != 0 ) { printf("pthread_create error!\n"); exit(1); }
z z z
{
{
{
int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype); void pthread_testcancel(void);
பைடு நூலகம்
线程的撤销(续)
线程的撤销(续)
z z z z z z z z z z z
for (i = 0; i < THREAD_NUMBER; i++) { ret_val = pthread_join(pt[i], NULL); if (ret_val != 0) { printf("pthread_join error!\n"); exit(1); } } pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); return 0; } thread2 sends cancelation request to thread1 thread2 ends now thread1 is in cancelation point
{
POSIX
z
z
z
{
许多其它的操作系统,例如 Microsoft Windows NT,都支持 POSIX 标准
POSIX 线程库Pthreads介绍
{
IEEE POSIX 标准 p1003.1c(Pthreads)定义了处理线程的一系列C 语 言类型的API。
z
POSIX 线程 是 线程的 POSIX标准,定义了创建和操纵线程的一套 API
{
程序运行结果:
z z z
{
在撤销线程的时候,可以编写程序让线程进一步进行所谓的 “清理”工作,比如已经拥有了某个 mutex,在清理例程中可 以释放这个 mutex;如果动态分配了内存,那么可以在清理例 程中释放动态分配的内存。
使用Pthreads编写的程序例子
{
一个简单的多线程程序helloworld.c,其创建了两个几乎一样 的线程
POSIX pthreads库(续)
{ {
线程的分离 pthread_join() 函数虽然可以等待被创建的线程的结束,且 可以回收被创建的线程的相关内存资源,但是这个函数的主要 缺点是要挂起调用pthread_join() 的线程。 POSIX线程库提供了一个函数pthread_detach(),使得子线程 本身自己有自我回收内存资源的能力。此函数的原型是:
{
{ { { { { { { { { { { { { { { { { { {
使用线程撤销相关的操作的例子
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define THREAD_NUMBER 2 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_t pt[THREAD_NUMBER]; void* thread1(void *arg) { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); pthread_mutex_lock(&mutex); sleep(5); printf("now thread1 is in cancelation point\n"); /* pthread_cond_wait 是一撤销点,thread1 在这里等待条件变量的满足 */ pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex); pthread_exit(NULL); }
{
{
int pthread_detach(pthread_t th);
{ {
这个函数的目的是让线程 th 可以处于分离(detached)状态 处于分离状态的线程有能力在自己结束执行的时候回收相关 的内存资源
POSIX pthreads库(续)
{ {
获得当前线程标志 使用pthread_self()函数可以获得当前线程的标志, pthread_self()的返回值就是当前线程的标志。其函数原型是:
z z z z z z z z z z z z z z z z z z z
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define THREAD_NUMBER 2 int retval_hello1= 2, retval_hello2 = 3; void* hello1(void *arg) { char *hello_str = (char *)arg; sleep(1); printf("%s\n", hello_str); pthread_exit(&retval_hello1); } void* hello2(void *arg) { char *hello_str = (char *)arg; sleep(2); printf("%s\n", hello_str); pthread_exit(&retval_hello2); }
z
使用Pthreads编写的程序例子(续)
{ { { { { {
{ { { { { {
{ { { { { { { { {
int main(int argc, char *argv[]) { int i; int ret_val; int *retval_hello[2]; /* 申明pthread_t 类型的数组 pt 用来存放创建线程得到的线程的标志。这里创建的两个线程,分别传递了不同的参 数,分别arg[0] 和 arg[1] 指向所要传递的字符串起始地址。*/ pthread_t pt[THREAD_NUMBER]; const char *arg[THREAD_NUMBER]; arg[0] = "hello world from thread1"; arg[1] = "hello world from thread2"; printf("Begin to create threads...\n"); /* 使用 pthread_create() 分别创建了两个线程。创建线程的时候,pthread_create() 的第二个参数是 NULL ,表示被创建的线程拥有缺省的属性:被创建的线程是处于可加入状态,且其调度机制是普通的非实时的 */ ret_val = pthread_create(&pt[0], NULL, hello1, (void *)arg[0]); if (ret_val != 0 ) { printf("pthread_create error!\n"); exit(1); ret_val = pthread_create(&pt[1], NULL, hello2, (void *)arg[1]); if (ret_val != 0 ) { printf("pthread_create error!\n"); exit(1); }
{ {
在Linux中,线程一般被认为是“轻量级的进程”。 Linux 创建进程所使用的函数是fork() 或者vfork()。而对线程的创 建和管理,Linux可以使用POSIX的线程库pthreads提供的APIs。 Linux提供的多线程和多进程执行环境主要目的是提高系统资源利用 率和任务的并发或并行程度。 针对Windows操作系统,Pthreads也存在一个开放源代码的版本,称 为pthreads-win32
z
pthread_t pthread_self(void);
线程的撤销
{
一个线程可以通过向另个线程发送“请求”来结束另一个线程 的执行。pthread_cancel()函数可以完成这个功能。 接收撤销请求的线程并不是“随便”就结束了自己的执行,它 可以忽略、推迟、或者立即响应别的线程发来的结束线程执行 的请求,这取决于线程设置。 这里的“推迟”是指线程执行到撤销点(cancellation point) 的时候,才执行线程的撤销操作。 POSIX pthreads库中关于撤销操作的函数有: