• linux下的多线程,pthread_create函数


    pthread_create是UNIX环境创建线程函数

    头文件

      #include<pthread.h>

    函数声明

      int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

    返回值

      若成功则返回0,否则返回出错编号

     

      返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

     

      linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。

     

      由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 修饰的指针是存取对象的唯一方法的假设,更好地优化某些类型的例程。

    参数

      第一个参数为指向线程标识符的指针。

     

      第二个参数用来设置线程属性。

     

      第三个参数是线程运行函数的起始地址。

     

      最后一个参数是运行函数的参数。

     

      另外,在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库

    示例

      打印线程 IDs

     

      #include <pthread.h>

     

      #include <stdlib.h>

     

      #include <stdio.h>

     

      #include <unistd.h>

     

      #include <string.h>

     

      pthread_t ntid;

     

      void printids(const char *s)

     

      {

     

      pid_t pid;

     

      pthread_t tid;

     

      pid = getpid();

     

      tid = pthread_self();

     

      printf("%s pid %u tid %u (0x%x) ", s,

     

      (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);

     

      } void *thr_fn(void *arg)

     

      {

     

      printids("new thread: ");

     

      return((void *)0);

     

      }

     

      int main(void)

     

      {

     

      int err;

     

      err = pthread_create(&ntid, NULL, thr_fn, NULL);

     

      if (err != 0)

     

      printf("can't create thread: %s ", strerror(err));

     

      printids("main thread:");

     

      sleep(1);

     

      exit(0);

     

      }

     

      $ gcc main.c -lpthread

     

      $ ./a.out

    向线程函数传递参数详解:

    向线程函数传递参数分为两种:

    (1)线程函数只有一个参数的情况:直接定义一个变量通过应用传给线程函数。

    例子:

    #include <iostream>
    #include <pthread.h>
    using namespace std;
    pthread_t thread;
    void fn(void *arg)
    {
        int i = *(int *)arg;
        cout<<"i = "<<i<<endl;
        return ((void *)0);
    }
    int main()
    {
        int err1;
        int i=10;
       err1 = pthread_create(&thread, NULL, fn, &i);
        pthread_join(thread, NULL);
    }
    2、线程函数有多个参数的情况:这种情况就必须申明一个结构体来包含所有的参数,然后在传入线程函数,具体如下:

    例子:

    首先定义一个结构体:

    struct  parameter

    {

      int size,

      int count;

    。。。。。

    。。。 
    };

    然后在main函数将这个结构体指针,作为void *形参的实际参数传递

    struct parameter arg;

    通过如下的方式来调用函数:
    pthread_create(&ntid, NULL, fn,& (arg));
    函数中需要定义一个parameter类型的结构指针来引用这个参数 

    void fn(void *arg)
    {
        int i = *(int *)arg;
        cout<<"i = "<<i<<endl;
        return ((void *)0);
    }

    void thr_fn(void *arg)
    {
           struct parameter *pstru;
           pstru = ( struct parameter *) arg;
           然后在这个函数中就可以使用指针来使用相应的变量的值了。
    }
  • 相关阅读:
    基于redis实现可靠的分布式锁
    基于react实现无限分级菜单
    利用免费cdn加速webpack单页应用
    研究一下javascript的模块规范(CommonJs/AMD/CMD)
    基于ReactCSSTransitionGroup实现react-router过渡动画
    react + iscroll5 实现完美 下拉刷新,上拉加载
    如何在多线程leader-follower模式下正确的使用boost::asio。
    【深入浅出Linux网络编程】 “实践 -- TCP & UDP”
    【hbase0.96】基于hadoop搭建hbase的心得
    【hadoop2.2(yarn)】基于yarn成功执行分布式map-reduce,记录问题解决过程。
  • 原文地址:https://www.cnblogs.com/fengbeihong/p/3414457.html
Copyright © 2020-2023  润新知