精华内容
下载资源
问答
  • Linux 多线程函数解析

    千次阅读 2012-03-04 22:03:28
    Linux多线程函数解析 Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join(); 它们都是在头文件之中。编译时需要加静态库-lpthread 下面是函数的说明:pthread_create是...
     
    

    Linux多线程函数解析

    Linux多线程函数用得比较多的是下面的3个
    pthread_create(),pthread_exit(),pthread_join(); 它们都是在头文件之中。编译时需要加静态库-lpthread

    下面是函数的说明:pthread_create是UNIX环境创建线程函数
    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系统的默认库

    pthread_exit(void* retval);
    线程通过调用pthread_exit函数终止自身执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。该指针可以通过pthread_join(pthread_t tpid, void **value_ptr)中的第二个参数value_ptr获取到。

    函数pthread_join用来等待一个线程的结束。函数原型为:
      extern int pthread_join __P (pthread_t __th, void **__thread_return);
    第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程退出时的返回值。
    这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
    所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。

    下面是一个简单的例子,子线程thread_fun会打出5次“this is thread_fun print!”然后调用pthread_exit退出,并返回一个指向字符串“this is thread return value!”的指针。在主函数里面调用pthread_join等待thread_fun线程结束,然后读取子线程的返回值到value中,再打印出来。
    输出结果是:
    pthread_create ok!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    pthread exit value: this is thread return value!

    01.#include
    02.#include
    03.#include
    04.#include
    05.#include
    06.#include
    07.//
    08.void *thread_fun(void *arg) {
    09. int i=0;
    10. char *value_ptr = "this is thread return value!\n";
    11. for (i=0; i<5; i++) {
    12. printf("this is thread_fun print!\n");
    13. sleep(1);
    14. }
    15. pthread_exit((void*)value_ptr);
    16.}
    17.//
    18.int main(int argc, char **argv) {
    19. pthread_t pid;
    20. int ret;
    21. void* value;
    22.
    23. ret = pthread_create(&pid, NULL, thread_fun, NULL);
    24. if (ret) {
    25. printf("pthread_create failed!\nerrno:%d\n", errno);
    26. return -1;
    27. }
    28. printf("pthread_create ok!\n");
    29.
    30. pthread_join(pid, &value);
    31. printf("pthread exit value: %s\n", value);
    32. return 0;
    33.}
    34.

    展开全文
  • Linux多线程函数解析

    千次阅读 2011-12-28 22:36:40
    Linux多线程函数解析 Linux多线程函数用得比较多的是下面的3个 pthread_create(),pthread_exit(),pthread_join();它们都是在头文件之中。编译时需要加静态库-lpthread   下面是函数的说明:  pthread_create...
     
     Linux多线程函数解析
    Linux多线程函数用得比较多的是下面的3个
    pthread_create(),pthread_exit(),pthread_join();它们都是在头文件<pthread.h>之中。编译时需要加静态库-lpthread

     

    下面是函数的说明:
      pthread_create是UNIX环境创建线程函数
    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系统的默认库


    pthread_exit(void* retval);
    线程通过调用pthread_exit函数终止自身执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。该指针可以通过pthread_join(pthread_t tpid, void **value_ptr)中的第二个参数value_ptr获取到。

     

    函数pthread_join用来等待一个线程的结束。函数原型为:
      extern int pthread_join __P (pthread_t __th, void **__thread_return);
    第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程退出时的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。如果执行成功,将返回0,如果失败则返回一个错误号。
    所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。

     


    下面是一个简单的例子,子线程thread_fun会打出5次“this is thread_fun print!”然后调用pthread_exit退出,并返回一个指向字符串“this is thread return value!”的指针。在主函数里面调用pthread_join等待thread_fun线程结束,然后读取子线程的返回值到value中,再打印出来。
    输出结果是:
    pthread_create ok!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    this is thread_fun print!
    pthread exit value: this is thread return value!

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <pthread.h>
    //
    void *thread_fun(void *arg) {
        int i=0;
        char *value_ptr = "this is thread return value!\n";
        for (i=0; i<5; i++) {
            printf("this is thread_fun print!\n");
            sleep(1);
        }
        pthread_exit((void*)value_ptr);
    }
    //
    int main(int argc, char **argv) {
        pthread_t pid;
        int ret;
        void* value;
    
        ret = pthread_create(&pid, NULL, thread_fun, NULL);
        if (ret) {
            printf("pthread_create failed!\nerrno:%d\n", errno);
            return -1;
        }
        printf("pthread_create ok!\n");
    
        pthread_join(pid, &value);
        printf("pthread exit value: %s\n", value);
        return 0;
    }
    
     
    

    展开全文
  • C++ 多线程函数通过引用返回值公司项目实施过程中,需要使用多线程提升程序运行速度,但是发现在类之内进行多线程调用有很多问题;main函数中使用多线程:以thread t1{thread_task1};即可开启多线程 thread t1{...

    C++ 多线程函数通过引用返回值


    公司项目实施过程中,需要使用多线程提升程序运行速度,但是发现在类之内进行多线程调用有很多问题;

    main函数中使用多线程:

    thread t1{thread_task1};即可开启多线程

        thread t1{thread_task1};
        task2();
        if(t1.joinable())
            t1.join();

    在类函数中使用多线程:

    1. 但是在类函数中使用多线程,则存在很多问题,参见 当线程函数为C++类成员函数时,需要改写线程引用函数的方式:

      • 从:
        thread t1{thread_task1, N};
      • 变为:
        thread t1{std::bind(&MultiThreads::thread_task1,this,N)};
    2. 对于线程中存在函数返回引用的,请使用如下方式返回值:

      • 从:
        hist_locate(input, return_value);
      • 变为:注意,return_value为引用返回值,只有这样才会返回该值;
        thread t(std::bind(&LocatePlate::hist_locate, this, input, ref(return_value)));
    展开全文
  • VC++多线程函数调用

    千次阅读 2013-05-29 13:59:29
    在VC++中创建线程函数可以用API 或者MFC封装的多线程函数。。   函数原型 MSDN中CreateThread原型: HANDLE CreateThread(  LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD  SIZE_T dwStackSize, ...

          在VC++中创建线程函数可以用API 或者MFC封装的多线程函数。。

        

    函数原型

    MSDN中CreateThread原型:
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
      SIZE_T dwStackSize, // initial stack size
      LPTHREAD_START_ROUTINE lpStartAddress, // thread function
      LPVOID lpParameter, // thread argument
      DWORD dwCreationFlags, // creation option
      LPDWORD lpThreadId // thread identifier
      );

    参数说明

    lpThreadAttributes:指向 SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
    dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长 堆栈的大小。
    lpStartAddress,指向线程函数的 指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
    DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。
    //也可以直接调用void类型
    //但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如:(LPTHREAD_START_ROUTINE)MyVoid
    //然后在线程声明为:
    void MyVoid()
    {
    return;
    }
    lpParameter:向线程函数传递的参数,是一个指向结构的 指针,不需传递参数时,为NULL。
    dwCreationFlags :线程标志,可取值如下
    (1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
    (2)0:表示创建后立即激活。
    (3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈的大小,否则,dwStackSize指定提交的大小。该标记值在 Windows 2000/NT and Windows Me/98/95上不支持。
    lpThreadId:保存新线程的id。
    返回值:
    函数成功,返回线程句柄;函数失败返回false。
    若不想返回线程ID,设置值为NULL。
    函数说明:
    创建一个线程。
    语法:
    hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
    一般并不推荐使用 CreateThread函数,而推荐使用RTL 库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
    在MFC程序中,应该调用AfxBeginThread函数,在 Visual C++程序中应调用_beginthreadex函数。
    -----------------------------------------------------------------------------------------------------------------------------------
    在MFC中线程函数如何调用类的成员函数,。。
    第一种情况,是把线程函数定义为全局函数, 然后通过设置为类的友元函数来调用,这种方法还未试过。。
    第二种情况,是把线程函数定义为类的静态成员函数。这样的话,作为静态成员函数一般情况下也是不能调用类的非静态成员函数和变量。
    在MFC 对话框类中为了要实现线程函数调用对话框类的非静态成员变量和函数,需要传递给线程函数this指针。。比如
     class CDlg
    {
        int a ;
        void SetWindowText(CString str);
       static DWORD WINAPI ThreadFun(LPVOID lpParam);
    }
    为了使Thread可以调用SetWindowText,可以这样做
      HANDLE hThread;
     handle = CreateThread(NULL,0,ThreadFun,(LPVOID)this,0,NULL);
    CloseHandle(hThread);
    然后在ThreadFun()中把参数转换为对话框类的对象。
    DWORD WINAPI  CDlg::ThreadFun(LPVOID lpParam)
    {
        CDlg * dlg;
        dlg = (CDlg *) lpParam;
       dlg->a = 3; // 可以调用了。。。
      dlg->SetWindowText("hello"); 
    }







    展开全文
  • 异步执行函数线程Dome 调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。 _beginthread 参数和返回值 unsigned long _beginthread( void(_cdecl *start_address)(void *), //声明为void (*start_...
  • 关于若干Win32多线程函数API详解

    千次阅读 2008-11-26 19:30:00
    关于若干Win32多线程函数API详解 CreateThread函数功能:该函数创建一个在调用进程的地址空间中执行的线程。函数原型: HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, ...
  • C++多线程函数CreateThread()详解

    万次阅读 多人点赞 2018-03-29 14:51:53
    采用CreateThread()创建多线程程序 原创 2012年12月10日 11:44:59 36683 ...
  • Linux C语言多线程函数参数传入

    千次阅读 2019-02-15 00:20:55
    线程函数参数由结构体指针传入 #include &lt;pthread.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct { char name[20]; int time; int start; int end...
  • C/C++中,函数的本质是一段可执行代码,代码包括了局部变量、全局变量的地址等等。到汇编语言的级别,变量函数等都可以视为汇编的代码片段。函数的本质就是一个可执行...当一个线程执行一个函数的时候,会复制函数...
  • 最近学习需要,接触了C语言的多线程,网上搜索到的例子都不太容易理解,很多还是使用C++知识的,特别对于小白来说学习起来更加困难。因此在这里分享一下自己的学习心得,本文只涉及基本的C语言。
  • Linux多线程函数pthread_create()函数

    万次阅读 2013-08-08 21:13:29
    函数原型: #include int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);4个参数: ...第三个参数:线程运行函数的其实地址 第四个参数
  • 我参考了很资料,都很零碎。最后我不得已把run1(),run2(),run()全部声明为static,还是报错:"Severity Code Description Project File Line Error (active) argument of type "void (*)(A &a)" is incompatible ...
  • 线程按照其调度者可以分为用户级线程和核心级线程两种 用户级线程主要解决的是上下文...基本线程操作相关的函数: 1线程的建立结束 2线程的互斥和同步 3使用信号量控制线程 4线程的基本属性配置 基本线程操作:
  • C#多线程函数如何传参数和返回值

    千次阅读 2010-02-23 14:02:00
    提起多线程,不得不提起 委托(delegates)这个概念.我理解的委托就是 具有 同样参数和返回值 的函数的集合.比如public delegate void MyDelegate(int arg);就是这种形式的函数 void Myfuntion(int i); 的集合.如何...
  • Part1: 1、CRT简介: CRT: (C Runtime Library)即C运行时库,是系统运行的基础,包含了c常用的...在Windows环境下,VC提供的 C run-time library又分为动态运行时库、静态运行时库、多线程、单线程、调试版本
  • c++多线程函数----AfxBeginThread

    千次阅读 2012-04-11 23:24:19
    函数原型: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_...
  • C++多线程函数----AfxBeginThread

    千次阅读 2015-04-11 19:49:54
    函数原型: CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOIDpParam, intnPriority= THREAD_PRIORITY_NORMAL, UINTnStackSize= 0, DWORDdwCreateFlags= 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs...
  • 小白学c++之多线程函数返回值

    千次阅读 2014-11-19 22:20:14
    #include #include #include #include //pthread_mutex_t lock; int ticketcount=5; void* salewinds1(void* args) { while(ticketcount>0) ... printf("window1 start %d\n",ticketcount);... t
  • 1.把线程函数改为静态成员函数, 2在静态成员函数里使用类的非静态成员时,需要使用具体的类对象调用。解决办法,定义一个this指针。具体如下: 在类外面定义静态类指针 static ***Dlg *p_Dlg = NULL;
  • 基于MFC对话框类创建的线程,传递给线程函数2个参数,线程函数调用窗口类控件操作等。
  • C多线程编程以及线程函数

    万次阅读 多人点赞 2017-05-12 11:25:22
    线程(thread)函数结合信号量互斥锁等的应用实例。
  • 回调函数是通过指针调用的函数,最常使用的回调函数就是在创建线程时,以一个函数指针以及传递给这个函数个参数来调用线程函数来创建线程。那么一般的类成员函数是不能用作回调函数的,因为库函数在使用回调函数时...
  • 多线程程序的线程函数需要使用类的成员变量和成员函数时,通常通过定义线程函数为类的友元函数,然后才能像类自己的成员函数一样访问其成员变量和成员函数。这种方式非常的方便尤其相对于通过定义静态全局线程函数和...
  • 多线程不安全函数

    千次阅读 2016-05-06 09:50:48
    这几天调bug,该bug的特点...找了一天之后,终于发现,是因为在多线程函数中用了线程不安全的strtok函数导致的。 从网上搜了些资料, 多线程环境小心多线程不安全函数:strtok、asctime、ctime、gmtime and soo
  • 调用CreateThread(...)创建线程时要指定所创建线程的入口函数,此入口函数只能是全局函数或者类的静态成员函数。 全局函数很容易理解,但如果是类的成员函数则必须是静态成员函数,为何, 因为类的非静态成员函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 913,572
精华内容 365,428
关键字:

多线程函数