[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$ 

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

同步

时间: 2024-10-27 08:04:29

[linux basic]--线程的相关文章

Linux/UNIX线程控制

线程控制 线程属性 调用pthread_create函数的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结果的指针.可以用pthread_attr_t结构修改线程默认属性,并把这些属性与创建的线程联系起来.可以使用pthread_attr_init函数初始化pthreaad_attr_t结构.调用pthread_attr_init以后,pthread_attr_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值.如果要修改其中个别属性的值,需要调用其他的函数.pt

Linux中线程的挂起与恢复(进程暂停)

http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整详细的代码.故自己整理了一下 程序流程为:主线程创建子线程(当前子线程状态为stop停止状态),5秒后主线程唤醒子线程,10秒后主线程挂起子线程,15秒后主线程再次唤醒子线程,20秒后主线程执行完毕等待子线程退出. 代码如下:#include#include#include#include#incl

Linux编程---线程

首先说一下线程的概念.其实就是运行在进程的上下文环境中的一个执行流.普通进程只有一条执行流,但是线程提供了多种执行的路径并行的局面. 同时,线程还分为核心级线程和用户级线程.主要区别在属于核内还是核外. 核心级线程,地位基本和进程相当,由内核调度.也就是说这种系统时间片是按线程来分配的.这种线程的好处就是可以适当的运用SMP,即针对多核CPU进行调度. 用户级线程,在用户态来调度.所以相对来说,切换的调度时间相对核心级线程来说要快不少.但是不能针对SMP进行调度. 对于现在的系统来说,纯粹的用户

ZZ Linux最大线程数限制及当前线程数查询

Linux最大线程数限制及当前线程数查询 [日期:2015-01-04] 来源:Linux社区  作者:zhangming [字体:大 中 小] Linux最大线程数限制及当前线程数查询 1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_process(ulimit -u) #系统限制某用户下最多可以运行多少进程或线程 /proc/sys/vm/ma

Linux下线程pid和tid

#include <stdio.h> #include <pthread.h> #include <sys/types.h> #include <sys/syscall.h> struct message { int i; int j; }; void *hello(struct message *str) { printf("child, the tid=%lu, pid=%d\n",pthread_self(),syscall(SYS

Linux/UNIX线程(1)

线程(1) 本文将介绍怎样使用多个控制线程在单个进程环境中运行多个任务. 一个进程中的全部线程都能够訪问该进程的组成部件(如文件描写叙述符和内存). 线程包含了表示进程内运行环境必须的信息,当中包含进程中标识线程的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字.errno变量以及线程私有数据.进程的全部信息对该进程的全部线程都是共享的,包含可运行的程序文本.程序的全局内存和堆内存.栈以及文件描写叙述符. 线程标识 进程ID在整个系统中是唯一的.每一个线程ID.线程ID仅仅在它所属的进程

linux下线程

linux下线程 线程与进程的关系: 之前转载的微信文章,进程与线程的差别已经说得比較清楚了.能够查看之前转载的文章.linux进程与线程的差别. 创建一个线程: #include<pthread.h> int pthread_creat(pthread_t * thread,pthread_attr_t * attr,void *(*stat_routine)(void *),void *arg); 惯例先写上函数原型: 參数:第一个參数pthread_t * thread 是一个指针,当进

Linux 下线程的理解

2017-04-03 最近深入研究了下Linux线程的问题,发现自己之前一直有些许误解,特记之-- 关于Linux下的线程,各种介绍Linux的书籍都没有深入去解释的,或许真的如书上所述,Linux本质上不存在线程的概念!在某种程度上的确是这样,但是难道LInux就只有一种进程的东西么??答案肯定是否定的!下面咱们慢慢分析 说起Linux下的线程,的确不如windows下来的直接,windwos中进程和线程有着明确的区分,各自有自己代表的数据结构.操作API,进程享有资源和线程参加调度.一切都是

【Linux】线程并发拷贝程序

据说大连某211高校的李教授越来越重口.不仅延续要求他所带的每个本科班.都要写一份线程并发拷贝程序的传统,并且还開始规定不能用Java语言写作.导致我之前写的<[Java]线程并发拷贝程序>(点击打开链接)作废.全部李教授旗下的学生,必须在毫无图形界面的Linux系统.用里面vi去写作. 这更让莘莘学子们感觉本来头来就不光明的天空更加黑暗起来. 更重要的是.若干年过去了,网上对其的研究与资料,依然是少数.依然是那份流传已久,以讹传讹的C语言版. 尽管这个程序毫无研究价值,可是本着治病救人.同一