Linux 进程与线程六

//线程间的通信
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>

/*线程1与控制线程通信方法1--全局变量*/
int g_num=10;

void *thread_run(void *arg)
{
    //线程1被分离了,但最好不要使用pthread_join()函数接受,多线程下报错内存溢出
    pthread_detach(pthread_self());
    int *p=(int *)arg;
    (*p)++;
    g_num=12;
    /*线程1与控制线程通信方法2--pthread_exit()函数的参数*/
    //pthread_exit(p);
    //执行pthread_exit()函数后,线程会直接退出
    printf("线程1退出了!\n");    /*线程1与控制线程通信方法3--线程中return*/
    return p;
}

int main(int arg,char *args[])
{
    /*
     * 每个线程都拥有各自的栈内存,但是彼此之间的栈内存是可以互相访问,
     * 比如在控制线程定义的变量,可以在线程1中访问
     * 线程1中定义变量可能无法在控制线程访问,因为无法确定变量是否因为线程执行完毕被释放了
     * */
    int index=0;
    pthread_t thr1;
    if(pthread_create(&thr1,NULL,thread_run,&index)!=0)
    {
        printf("pthread_create() failed !\n");
        return -1;
    }
    //等待线程1
    int *p=NULL;
    pthread_join(thr1,(void **)&p);
    printf("线程1的返回值%d\n",*p);
    printf("控制线程的index=%d\n",index);
    printf("g_num=%d\n",g_num);
    return 0;
}
//线程的并行执行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>

void *thread_run(void *arg)
{
    //pthread_detach(pthread_self());
    if (arg != NULL)
    {
        int *p = (int *) arg;
        int i = 0;
        for (i = 0; i < *p; i++)
        {
            printf("这是线程%d的第%d圈!\n", (int) pthread_self(), i);
            sleep(1);
        }
    }
    return NULL;
}

int main(int arg, char *args[])
{
    int i = 0;
    int num1 = 10;
    int num2 = 10;
    printf("请输入创建线程的个数:\n");
    scanf("%d", &num1);
    printf("请输入每个线程的圈数:\n");
    scanf("%d", &num2);
    pthread_t thrs[200];
    /*
     * 多线程是并行运行的
     * */
    for (i = 0; i < num1; i++)
    {
        if (pthread_create(&thrs[i], NULL, thread_run, &num2) != 0)
        {
            printf("pthread_create() failed !\n");
            return -1;
        }
    }
    for (i = 0; i < num1; i++)
    {
        /*如果没有pthread_join(),那么控制线程不会等待子线程,会直接退出*/
        pthread_join(thrs[i],NULL);
    }
    return 0;
}
时间: 2024-08-09 10:39:16

Linux 进程与线程六的相关文章

Linux进程或线程绑定到CPU

Linux进程或线程绑定到CPU 为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程. 进程绑定到CPU Linux提供一个接口,可以将进程绑定到特定的CPU: #include <sched.h> int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpu

Linux 进程、线程运行在指定CPU核上

/******************************************************************************** * Linux 进程.线程运行在指定CPU核上 * 说明: * affinity参数决定了进程.线程是否可在CPU多核之间切换,当然,并不是说就不进行 * 线程切换. * * 2017-9-22 深圳 龙华樟坑村 曾剑锋 *********************************************************

linux 进程 VS 线程

在进行编程模型选择时,总是要对进程和线程的优缺点进行对比,才能做出决定.这里对常用的对比纬度进行了总结,如有新发现,我会更新. linux 进程 VS 线程

Linux进程和线程的比较

进程与线程 参考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比较Linux进程和线程的创建的区别,以此展开: 创建进程:(1)调用fork(),为子进程新建内核栈.pthread_info和task_struct,复制父进程的大部分的参数,采用写时复制(copy-on-write)辅助父进程的资源,修改子进程如pid.ppid等重要资源.(2)调用exec()为子进程分配地址空间,载入执行程序. 创建线程:

探究Linux进程及线程堆栈专题&lt;一&gt;

“你定义了那么多全局变量,系统才给你分配了几百KB,这样做是不是太耗内存了?”,一同学问道. 老早就听说嵌入式系统各种资源有限啊,不能分配大空间啊要注意节约资源之类的(...貌似米神4的配置要完爆我的thinkpad了...).那是不是全局变量的使用真的会占用很大系统内存,而系统真的才分配几百KB空间给我呢? 我不信,所以我要尝试一下: 全局变量,肯定是要占用内存的,但无论是不是全局变量,只要是已定义的变量都会占用内存,这个和是否是全局的没啥关系,只是占用的区域不一样而已(详见APUE存储器安排

linux进程、线程(or子进程)、资源占用查看

#  linux进程.线程(or子进程).资源占用查看 查看进程: ps -ef | more  (-e:所有进程,-f:全格式) ++++++++++++++++++++++++++++++++++++ + UID :用户ID                     + + PID :进程ID                           + + PPID :父进程ID                                                 + + C :CPU占

windows和linux进程与线程的理解

对于windows来说,进程和线程的概念都是有着明确定义的,进程的概念对应于一个程序的运行实例(instance),而线程则是程序代码执行的最小单元.也就是说windows对于进程和线程的定义是与经典OS课程中所教授的进程.线程概念相一致的. 提供API,CreateThread()用于建立一个新的线程,传递线程函数的入口地址和调用参数给新建的线程,然后新线程就开始执行了. windows下,一个典型的线程拥有自己的堆栈.寄存器(包括程序计数器PC,用于指向下一条应该执行的指令在内存中的位置),

Linux进程与线程的区别

cnyinlinux 本文较长,耐心阅读,必有收获! 进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念,在工作实际中去运用成为了焦点.而资深工程师则在考虑系统层面如何实现两种技术及其各自的性能和实现代价.以至于到今天,Linux内核还在持续更新完善(关于进程和线程的实现模块也是内核完善的任务之一). 本文将以一个从事Linux平台系统开发的程序员角

操作系统:Linux进程与线程

这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建子进程B 子进程B与父进程A分别对应不同的可执行体:A打印Hello world,B实现sum累加 进程B具有三线程,主线程创建新的线程1实现sum累加(从1到参数x),线程2监控输入参数x 若输入x是非负整数,线程1开始计算:如果线程1正在计算前次程序,线程2的输入非负整数和最近一次的又不同,线程