2019-12-10 19:07:44 u010299133 阅读数 70
  • linux线程全解-linux应用编程和网络编程第7部分

    本课程讲解linux中线程,首先使用多进程解决上个课程中提出的并发式读取按键和鼠标的任务,然后引出多线程并讲解多线程的优势,后详细讲了多线程的同步技术。学习本课程的目的是学会在linux应用编程中使用多线程技术。

    5140 人正在学习 去看看 朱有鹏

最近在Linux平台下编程的时候,涉及到多线程的使用,在创建线程的时候少不了需要向线程中传递一些参数。

Linux中的线程创建函数:

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

 

第四个参数void *arg就是创建线程的时候需要传递的参数。


下面记录一下错误的使用案例

案例一:

int sockfd;

pthread_create(&tidp, NULL, pthread_fun,(void *)&sockfd);

这种传递并没有将int型的变量的值传递到线程中的,需要在加上括号,如下所示:

pthread_create(&tidp, NULL, pthread_fun,(void *)(&sockfd));


案例二:

int fun1(st_data *my_data)//st_data是自己的参数结构体

{

    pthread_create(&tidp, NULL, pthread_fun,(void *) my_data);

}

这种也是不行的,my_data的参数不能够正常的传递到线程函数中去。可以修改为如下形式:

int fun1(st_data *my_data)//st_data是自己的参数结构体

{

    st_data arg_data;

    memcpy(&arg_data, my_data, sizeof(st_data));

    pthread_create(&tidp, NULL, pthread_fun,(void *)(&arg_data));

}

2018-07-09 15:01:27 nicholas_dlut 阅读数 5265
  • linux线程全解-linux应用编程和网络编程第7部分

    本课程讲解linux中线程,首先使用多进程解决上个课程中提出的并发式读取按键和鼠标的任务,然后引出多线程并讲解多线程的优势,后详细讲了多线程的同步技术。学习本课程的目的是学会在linux应用编程中使用多线程技术。

    5140 人正在学习 去看看 朱有鹏
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
 
#define    NUM_THREADS     8
 
void *PrintHello(void *args)
{
    int thread_arg;
    sleep(1);
    thread_arg = (int)(*((int*)args));
    printf("Hello from thread %d\n", thread_arg);
    return NULL;
}
 
int main(void)
{
    int rc,t;
    pthread_t thread[NUM_THREADS];
 
    for( t = 0; t < NUM_THREADS; t++)
    {
        printf("Creating thread %d\n", t);
        rc = pthread_create(&thread[t], NULL, PrintHello, &t);
        if (rc)
        {
            printf("ERROR; return code is %d\n", rc);
            return EXIT_FAILURE;
        }
    }
    sleep(5);
    for( t = 0; t < NUM_THREADS; t++)
        pthread_join(thread[t], NULL);
    return EXIT_SUCCESS;
}




有一点要特别注意,传递的变量地址最好是全局变量,或者加上sleep,这样可以保证线程启动接收到的参数地址有效
2012-08-13 20:06:19 xiaocaichonga 阅读数 226
  • linux线程全解-linux应用编程和网络编程第7部分

    本课程讲解linux中线程,首先使用多进程解决上个课程中提出的并发式读取按键和鼠标的任务,然后引出多线程并讲解多线程的优势,后详细讲了多线程的同步技术。学习本课程的目的是学会在linux应用编程中使用多线程技术。

    5140 人正在学习 去看看 朱有鹏

在linux系统中,系统将进程和线程同等看待。

而创建过程中也是使用相同的函数clone,唯一的区别是向clone传递的参数不同,传递一种参数时,从编程者的角度来看创建的是进程,而传递另外一种参数时,创建的线程。

这个参数区分了线程和进程。往往这些参数标示了 线程共享了哪些资源

比如创建进程可以传递参数clone(SIGCHLD, 0);

创建一个线程传递参数clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);  注:在这里线程见共享的资源是:地址空间,文件系统信息,文件和信号处理函数等。



参考文献:http://blog.chinaunix.net/uid-24567872-id-100482.html


2017-12-07 21:01:32 weixin_37787043 阅读数 2072
  • linux线程全解-linux应用编程和网络编程第7部分

    本课程讲解linux中线程,首先使用多进程解决上个课程中提出的并发式读取按键和鼠标的任务,然后引出多线程并讲解多线程的优势,后详细讲了多线程的同步技术。学习本课程的目的是学会在linux应用编程中使用多线程技术。

    5140 人正在学习 去看看 朱有鹏
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include <string.h>

//Linux多线程编程之线程之间的参数传递

/*
int pthread_join(pthread_t thread, void **retval);
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
void pthread_exit(void *retval);
pthread_t pthread_self(void);
*/

/*
    linux中线程属于第三方库开发
    安装线程库man手册:
        sudo  apt-get install   manpages manpages-dev
        sudo  apt-get install   manpages-posix-dev
    编译:
        gcc  -o   bin   src.c   -lpthread  //指定线程库链接
*/

//线程1执行函数
void *pthread_1(void *arg)
{
    printf("pthread 1 run...\n");
    char *ptr = NULL;
    ptr = (char *)arg;

    int i =2;
    while(i--){
        printf("thread1 i =%d  ptr=%s \n",i,ptr);
        sleep(1);
    }

    char *str = "hello";  //指针指向只读数据区
//  char str[] ="hello";  //栈空间是独立的,线程结束释放
    printf("pthread 1 exit\n");
    printf("-----------------\n");
    pthread_exit(str);//结束线程1

    return NULL;
}

struct stu_info{
    char name[20];
    int score;
};

//线程2执行函数
void *pthread_2(void *arg)
{
    printf("pthread 2 run..\n");

    struct stu_info *st =NULL;
    st = (struct stu_info *)malloc(sizeof(struct stu_info));
    if(!st){
        perror("malloc");
        pthread_exit(NULL);
    }

    strncpy(st->name,"liucong",7);//字符串复制
    st->score = 100;    

    sleep(3);
    printf("pthread 2 exit\n");
    printf("-----------------\n");

    pthread_exit((void *)st);

    return NULL;
}

int main()
{
    printf("main thread tid = 0x%x\n",pthread_self());
    char str[] = "hello world";

    //创建子线程1:传递参数
    pthread_t tid1;//定义子线程标识符
    pthread_create(&tid1,NULL,pthread_1,NULL);//pthread_1即线程执行函数

    //创建子线程2
    pthread_t tid2;//定义子线程标识符
    pthread_create(&tid2,NULL,pthread_2,NULL);//pthread_2即线程执行函数


    char *string =NULL;
    //阻塞等待子线程1结束,回收子线程结束8kb物理内存
    pthread_join(tid1,(void **)&string);//阻塞等待的返回值是string,关键
    printf("string =%s\n",string);

    struct stu_info *ptr =NULL;

    //阻塞等待子线程2结束,回收子线程结束8kb物理内存
    pthread_join(tid2,(void **)&ptr);//阻塞等待的返回值是ptr,关键
    if(ptr !=NULL){
        printf("name =%s score=%d\n",ptr->name,ptr->score);
        free(ptr);
    }

    //sleep(5);
    printf("main pthread exit\n");
    pthread_exit(NULL);  //结束主线程    

    return 0;
}

/*
$ ./a.out
main thread tid = 0xb75286c0
pthread 1 run...
thread1 i =1  ptr=(null) 
pthread 2 run..
thread1 i =0  ptr=(null) 
pthread 1 exit
-----------------
string =hello
pthread 2 exit
-----------------
name =liucong score=100
main pthread exit
*/






2016-12-12 18:38:00 weixin_30911451 阅读数 12
  • linux线程全解-linux应用编程和网络编程第7部分

    本课程讲解linux中线程,首先使用多进程解决上个课程中提出的并发式读取按键和鼠标的任务,然后引出多线程并讲解多线程的优势,后详细讲了多线程的同步技术。学习本课程的目的是学会在linux应用编程中使用多线程技术。

    5140 人正在学习 去看看 朱有鹏

  传递参数的两种方法

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

  例子

  #include

  #include

  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);

  }

  操作系统以进程为单位分配资源。

  线程是执行单位,线程函数有多个参数的情况:这种情况就必须申明一个结构体来包含所有的参数,然后在传入线程函数。

  具体请查看代码:

  Mularg.c

  #include

  #include

  #include

  #include

  typedef struct arg_struct ARG ;

  struct arg_struct {

  char name[10] ;

  int age ;

  float weight ;

  } ;

  void * thfn ( void * arg )

  {

  ARG * p = (ARG *) arg ;

  printf( " name is : %s , age is : % d , weight is : %f \ n " , p->name , p->age , p->weight ) ;

  return NULL ;

  }

  int main(int argc , char *argv [ ] )

  {

  pthread_t tid ;

  ARG arg ;

  int err ;

  strcpy ( arg.name , " zhanggd " ) ;

  arg.age = 26 ;

  arg.weight = 70 ;

  err = pthread_create ( &tid , NULL , thfn , (void *) & arg ) ;

  if( err != 0 ) {

  printf( " can’ˉt create thread %s\n", strerror(err) ) ;

  exit(1);

  }

  return 0 ;

  }

  程序执行结果:

 

原文链接:http://www.maiziedu.com/wiki/process/pass/

 

转载于:https://www.cnblogs.com/maizi008/p/6165568.html

Linux线程的创建

阅读数 781

Linux多线程编程

阅读数 22

没有更多推荐了,返回首页