Linux中多线程详解及简单实例

 更新时间:2017年07月26日 15:07:49   作者:Sweet_wen  
这篇文章主要介绍了Linux中多线程详解及简单实例的相关资料,这里对线程概念及优缺点做了详细介绍并说明如何创建和应用,需要的朋友可以参考下

Linux中多线程详解及简单实例

1.概念

进程:运行中的程序。

线程:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。

2.为什么要有线程?

用fork调用进程代价太高,需要让一个进程同时做多件事情,线程就非常有用。

3.线程的优点和缺点。

优点:

(1)有时,让程序看起来是在同时做两件事是非常有用的。 比如在编辑文档时,还能统计文档里的单词个数。
(2)一个混杂着输入、计算、输出的程序,利用线程可以将这3个部 分分成3个线程来执行,从而改变程序执行的性能。
(3)一般来说,线程之间切换需要操作系统所做的工作比进程间切换需要的代价小。

缺点:

(1)编写线程需要非常仔细的设计。
(2)对多线程的调试困难程度比单线程调试大得多。

4.创建线程

#include <pthread.h>
(1)int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
pthread_t pthread_self(void);
(2)int pthread_equal(pthread_t thread1,pthread_t thread2);
(3)int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));

Linux系统支持POSIX多线程接口,称为pthread。编写linux下的多线程程序,需要包含头文件pthread.h,链接时需要使用库libpthread.a。

如果在主线程里面创建线程,程序就会在创建线程的地方产生分支,变成两个部分执行。线程的创建通过函数pthread_create来完成。成功返回0。

1.线程创建: 
int pthread_create(pthread_t thread,pthread_attr_t *attr,void (start_routine)(void ),void *arg); 
pthread_t pthread_self(void); 
参数说明: 
thread:指向pthread_create类型的指针,用于引用新创建的线程。 
attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地设置为NULL。 
(start_routine)(void ):传递新线程所要执行的函数地址。 
arg:新线程所要执行的函数的参数。 
调用如果成功,则返回值是0,如果失败则返回错误代码。 
2.线程终止 
void pthread_exit(void *retval); 
参数说明: 
retval:返回指针,指向线程向要返回的某个对象。 
线程通过调用pthread_exit函数终止执行,并返回一个指向某对象的指针。注意:绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。 
3.线程同步 
int pthread_join(pthread_t th, void **thread_return); 
参数说明: 
th:将要等待的线程,线程通过pthread_create返回的标识符来指定。 
thread_return:一个指针,指向另一个指针,而后者指向线程的返回值。 

一个简单的创建多线程的程序:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *thread_function(void *arg);

char message[] = "Hello World";

int main()
{
  int res;
  pthread_t a_thread;
  void *thread_result;

  res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
  if (res != 0)
  {
    perror("Thread creation failed!");
    exit(EXIT_FAILURE);
  }

  printf("Waiting for thread to finish.../n");

  res = pthread_join(a_thread, &thread_result);
  if (res != 0)
  {
    perror("Thread join failed!/n");
    exit(EXIT_FAILURE);
  }

  printf("Thread joined, it returned %s/n", (char *)thread_result);
  printf("Message is now %s/n", message);

  exit(EXIT_FAILURE);
}

void *thread_function(void *arg)
{
  printf("thread_function is running. Argument was %s/n", (char *)arg);
  sleep(3);
  strcpy(message, "Bye!");
  pthread_exit("Thank you for your CPU time!");
}

输出结果

$./thread1[输出]:
thread_function is running. Argument was Hello World
Waiting for thread to finish...
Thread joined, it returned Thank you for your CPU time!
Message is now Bye!

以上就是Linux 多线程的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • linux系统下用.sh文件执行python命令的方法

    linux系统下用.sh文件执行python命令的方法

    这篇文章主要给大家介绍了关于linux系统下用.sh文件执行python命令的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友可以参考下
    2022-07-07
  • 非常好的12道shell命令经典面试问题

    非常好的12道shell命令经典面试问题

    shell面试题总结了一些,让我们一起看一下吧,非常好的12道shell命令经典面试问题,需要的朋友可以参考下
    2018-02-02
  • Shell脚本批量添加扩展名的两种方法分享

    Shell脚本批量添加扩展名的两种方法分享

    这篇文章主要介绍了Shell脚本批量添加扩展名的两种方法分享,本文讲解了用rename命令修改后缀名、用for、sed和mv修改后缀名、用find和xargs添加后缀名等方法,需要的朋友可以参考下
    2014-11-11
  • Linux文本查看命令及其选项详解(cat,head,tail)

    Linux文本查看命令及其选项详解(cat,head,tail)

    这篇文章主要介绍了Linux文本查看命令及其选项详解(cat,head,tail),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • shell数组操作简明总结

    shell数组操作简明总结

    这篇文章主要介绍了shell数组操作总结,这里包括数组的声明、访问、复制、计算、删除、替换等操作,需要的朋友可以参考下
    2014-05-05
  • 深入理解Shell输出颜色与控制

    深入理解Shell输出颜色与控制

    在Linux shell或者平时echo输出时有时为了区分某些字符串的重要性,往往对其输出内容添加颜色以醒目区分。下面这篇文章就主要介绍了关于Shell输出颜色与控制,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Shell基本运算符的实现

    Shell基本运算符的实现

    Shell支持多种运算符,主要包括算数运算符,关系运算符,布尔运算符,字符串运算符,文件测试运算符,下面我们就介绍一下这些运算符的用法
    2023-05-05
  • Linux命令之ps命令使用详解

    Linux命令之ps命令使用详解

    这篇文章主要给大家介绍Linux命令之ps命令使用方法,文中有详细的代码示例,对我们学习Linux命令有一定的帮助,感兴趣的同学可以参考阅读下
    2023-06-06
  • Linux使用pidof命令来快速查找进程id

    Linux使用pidof命令来快速查找进程id

    pidof 是一个简单而强大的命令行工具,广泛应用于进程管理和脚本编程中,理解如何有效地使用它可以大大提高你的工作效率,本文给大家介绍了Linux使用pidof命令来快速查找进程id的方法,需要的朋友可以参考下
    2025-03-03
  • Linux 中unzip解压时中文乱码的解决办法

    Linux 中unzip解压时中文乱码的解决办法

    这篇文章主要介绍了Linux 中unzip解压时中文乱码的解决办法的相关资料,这里提供两种解决办法,希望能通过本文帮助到大家,需要的朋友可以参考下
    2017-09-09

最新评论