Linux多线程编程 您所在的位置:网站首页 linux创建线程的三种方法 Linux多线程编程

Linux多线程编程

2023-07-30 22:22| 来源: 网络整理| 查看: 265

本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/

Linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量、信号量和读写锁。  下面是思维导图:

简介

进程— 资源分配的最小单位 线程— 程序执行的最小单位

进程是一个程序的一个实例,拥有自己独立的各种段(数据段,代码段等等),每次创建一个进程需要从操作系统分配这些资源给他,消耗一定的时间,在linux下C语言创建一个进程使用fork()函数; 线程是一个轻量级的进程,除了自己少数的资源,不用用其他资源,且一个进程可以创建多个线程,这些线程共享进程的资源,创建线程的时间要比创建进程少很多,(几十分之一),从函数角度是使用pthread_create()创建。 使用线程处理文件I/O或者socket处理都是非常有优势的,将一个大人物分解成若干个小任务,每个线程处理一个任务,线程之间切换不需要花很多时间,而且线程之间数据交换很方便,共享存储区。

C语言中使用多线程的函数

表 1. 线程函数列表

对象操作Linux Pthread APIWindows SDK 库对应 API线程创建pthread_createCreateThread退出pthread_exitThreadExit等待pthread_joinWaitForSingleObject互斥锁创建pthread_mutex_initCreateMutex销毁pthread_mutex_destroyCloseHandle加锁pthread_mutex_lockWaitForSingleObject解锁pthread_mutex_unlockReleaseMutex条件创建pthread_cond_initCreateEvent销毁pthread_cond_destroyCloseHandle触发pthread_cond_signalSetEvent广播pthread_cond_broadcastSetEvent / ResetEvent等待pthread_cond_wait / pthread_cond_timedwaitSingleObjectAndWait

多线程开发在 Linux 平台上已经有成熟的 Pthread 库支持。其涉及的多线程开发的最基本概念主要包含四点:线程,互斥锁,条件变量、读写锁。其中,线程操作又分线程的创建,退出,等待 3 种。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。

创建线程

int pthread_create(pthread_t * tid, const pthread_attr_t * attr, void * ( * func) (void * ), void * arg); 其返回值是一个整数,若创建进程成功返回0,否则,返回其他错误代码,也是正整数。

创建线程需要的参数:

线程变量名:pthread_t *类型,是标示线程的id,一般是无符号整形,这里也可以是引用类型,目的是用于返回创建线程的ID线程的属性指针:制定线程的属性,比如线程优先*级,初始栈大小等,通常情况使用的都是指针。创建线程的程序代码:一般是函数指针,进程创建后执行该函数指针只想的函数。程序代码的参数:若线程执行的函数包含由若干个参数,需要将这些参数封装成结构体,并传递给它指针。 创建线程的函数的形式如下: 结束线程

结束进程的函数定义如下:

void pthread_exit (void *status); 参数是指针类型,用于存储线程结束后返回状态。

线程等待

int pthread_join (pthread_t tid, void ** status);

第一个参数表示要等待的进程的id;第二参数表示要等待的进程的返回状态,是个二级指针。

线程创建后怎么执行,新线程和老线程谁先执行这些不是程序来决定,而是由操作系统进行调度的,但是在编程的时候我们常常需要多个线程配合工作,比如在结束某个线程之前,需要等待另外一个线程的处理结果(返回状态等信息),这时候就需要使用线程等待函数,这个函数的定义如下:

其他关于进程的函数

返回当前线程ID

pthread_t pthread_self (void); 用于返回当前进程的ID

制定线程变成分裂状态

int pthread_detach (pthread_t tid); 参数是指定线程的ID,指定的ID的线程变成分离状态;若指定线程是分离状态,则 如果线程退出,那么它所有的资源都将释放,如果线程不是分离状态,线程必须保留它的线程ID、退出状态,直到其他线程对他调用的pthread_join()函数

参考实例一

代码如下:

#include #include #include #include void print_message_func(void *ptr); int main() { int tmp1,tmp2; void *retival; pthread_t thread1,thread2; char *message1 = "thread1"; char *message2 = "thread2"; int ret_thread1,ret_thread2; ret_thread1 = pthread_create(&thread1,NULL,(void *)&print_message_func,(void *)message1); if(ret_thread1 == 0) printf("create thread 1 true\n"); else printf("create thread 1 false\n"); tmp1 = pthread_join(thread1,&retival); printf("thread 1 return value (tmp1) is %d\n",tmp1); if(tmp1 != 0) printf("cannot join with thread 1\n"); ret_thread2 = pthread_create(&thread2,NULL,(void *)&print_message_func,(void *)message2); if(ret_thread2 == 0) printf("create thread 2 true\n"); else printf("create thread 2 false\n"); tmp2 = pthread_join(thread2,&retival); printf("thread 2 return value (tmp2) is %d\n",tmp2); if(tmp2 != 0) printf("cannot join with thread 2\n"); } void print_message_func(void *ptr) { for(int i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有