[linux basic]--线程

Posted 积少成多

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[linux basic]--线程相关的知识,希望对你有一定的参考价值。

/*************************************************************************
    > File Name: thread1.c
    > Author: 
    > Mail: 
    > Created Time: 2016年03月26日 星期六 22时37分44秒
 ************************************************************************/

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

void *thread_function(void *arg);
char message[] = "hello world";

int main(){
    int res;
    pthread_t a_thread;
    void *thread_result;
    //pthread_create 开始运行多线程,如下所示
    res = pthread_create(&a_thread,NULL,thread_function,(void*)message);
    //先向pthrea_create传递了一个pthread_t类型对象的地址
    //后面我们可以用它来引用这个新线程
    //不想改变默认线程属性,第二个参数设置为NULL
    //最后两个参数分别是将要调用的函数和一个传递给该函数的参数

    if(res != 0){
        perror("thread creation failed");
        exit(EXIT_FAILURE);
    }
    //如果成功,就有两个线程运行,
    //1原来的线程,main继续执行pthread_create后面的代码
    //2新线程开始执行thread_function函数
    printf("Waiting for thread to finsh...\n");

    res = pthread_join(a_thread, &thread_result);
    //a_thread 正在等待其结束的线程的标识符
    //thread_result,指向线程返回值的指针
    //这个函数将等到它所指定的线程终止才返回,想想wait()的功能
    if(res!=0){
        perror("thread join failed");
        exit(EXIT_FAILURE);
    }
    //然后main打印新线程的返回值和全局变量message的值
    //exit
    printf("thread join, it returned %s\n",(char*)thread_result);
    printf("Message is now %s\n",message);
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg){
    printf("thread_function is running. Argument was %s\n",(char*)arg);
    sleep(3);
    //todo something
    strcpy(message,"Bye!");
    pthread_exit("thank you for the cpu time");
}

执行结果

[email protected]:~/basic$ ./thread1 
Waiting for thread to finsh...
thread_function is running. Argument was hello world
thread join, it returned thank you for the cpu time
Message is now Bye!

 ======================

同时执行--

/*************************************************************************
    > File Name: thread1.c
    > Author: 
    > Mail: 
    > Created Time: 2016年03月26日 星期六 22时37分44秒
 ************************************************************************/

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

void *thread_function(void *arg);
char message[] = "hello world";
int run_now = 1;

int main(){
    int res;
    pthread_t a_thread;
    void *thread_result;
    //pthread_create 开始运行多线程,如下所示
    res = pthread_create(&a_thread,NULL,thread_function,(void*)message );
    //先向pthrea_create传递了一个pthread_t类型对象的地址
    //后面我们可以用它来引用这个新线程
    //不想改变默认线程属性,第二个参数设置为NULL
    //最后两个参数分别是将要调用的函数和一个传递给该函数的参数
    int print_count1 = 0;
    while(print_count1++ < 20){
        if(run_now == 1){
            printf("1");
            run_now = 2;
        }else{
            sleep(1);
        }
    }

    if(res != 0){
        perror("thread creation failed");
        exit(EXIT_FAILURE);
    }
    //如果成功,就有两个线程运行,
    //1原来的线程,main继续执行pthread_create后面的代码
    //2新线程开始执行thread_function函数
    printf("Waiting for thread to finsh...\n");

    res = pthread_join(a_thread, &thread_result);
    //a_thread 正在等待其结束的线程的标识符
    //thread_result,指向线程返回值的指针
    //这个函数将等到它所指定的线程终止才返回,想想wait()的功能
    printf("thread joined\n");
    if(res!=0){
        perror("thread join failed");
        exit(EXIT_FAILURE);
    }
    //然后main打印新线程的返回值和全局变量message的值
    //exit
    //printf("thread join, it returned %s\n",(char*)thread_result);
//    printf("Message is now %s\n",message);
    printf("\n");
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg){
    //todo something
    int print_count2 = 0;
    while(print_count2++ < 20){
        if(run_now == 2){
            printf("2");
            run_now = 1;
        }else{
            sleep(1);
        }
    }
    printf("\n");
}

执行结果:

[email protected]:~/basic$ ./thread2
12121212121212121212
Waiting for thread to finsh...
thread joined

[email protected]:~/basic$ 

============

同步

 

以上是关于[linux basic]--线程的主要内容,如果未能解决你的问题,请参考以下文章

[linux basic 基础]----线程的属性

[linux basic 基础]----同步

PAT Basic 1049

[linux basic]基础--信号

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

PAT Basic 1078