多线程技术----最简单的demo开始之linux版

来源:互联网 发布:淘宝店铺违规24分 编辑:程序博客网 时间:2024/05/16 08:50

本文主要转载

http://blog.csdn.net/monkey_d_meng/article/details/5628663,感谢作者的分享。

整理此博客,主要是为了假以时日,方便复习。与上篇博客一样,本文旨在通过最简单的demo,熟悉核心的函数,掌握多线程的使用。

 

Linux进程与线程

       Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄和当前目录状态。

Linux通过fork创建子进程与创建线程之间是有区别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的变量和自己的PID,它的时间调度是独立的,它的执行几乎完全独立于父进程。

进程可以看成一个资源的基本单位,而线程是程序调度的基本单位,一个进程内部的线程之间共享进程获得的时间片。

Demo

</pre><pre name="code" class="cpp">#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!");}

核心函数

        大多数pthread_XXX系列的函数在失败时,并未遵循UNIX函数的惯例返回-1,这种情况在UNIX函数中属于一少部分。如果调用成功,则返回值是0,如果失败则返回错误代码。

1.线程创建

#include<pthread.h>

int pthread_create(pthread_t *thread, pthread_attr_t *attr, void*(*start_routine)(void *), void *arg);

参数说明:

thread:指向pthread_create类型的指针,用于引用新创建的线程。

attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地设置为NULL。

*(*start_routine)(void*):传递新线程所要执行的函数地址。

arg:新线程所要执行的函数的参数。

调用如果成功,则返回值是0,如果失败则返回错误代码。

 

2.线程终止:

#include<pthread.h>

void pthread_exit(void *retval);

参数说明:

retval:返回指针,指向线程向要返回的某个对象。

线程通过调用pthread_exit函数终止执行,并返回一个指向某对象的指针。注意:绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。

 

3.线程同步:

#include<pthread.h>

int pthread_join(pthread_t th, void **thread_return);

参数说明:

th:将要等待的线程,线程通过pthread_create返回的标识符来指定。

thread_return:一个指针,指向另一个指针,而后者指向线程的返回值。



0 0