zoukankan      html  css  js  c++  java
  • 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退出了!
    ");
        /*线程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 !
    ");
            return -1;
        }
        //等待线程1
        int *p=NULL;
        pthread_join(thr1,(void **)&p);
        printf("线程1的返回值%d
    ",*p);
        printf("控制线程的index=%d
    ",index);
        printf("g_num=%d
    ",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圈!
    ", (int) pthread_self(), i);
                sleep(1);
            }
        }
        return NULL;
    }
    
    int main(int arg, char *args[])
    {
        int i = 0;
        int num1 = 10;
        int num2 = 10;
        printf("请输入创建线程的个数:
    ");
        scanf("%d", &num1);
        printf("请输入每个线程的圈数:
    ");
        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 !
    ");
                return -1;
            }
        }
        for (i = 0; i < num1; i++)
        {
            /*如果没有pthread_join(),那么控制线程不会等待子线程,会直接退出*/
            pthread_join(thrs[i],NULL);
        }
        return 0;
    }
  • 相关阅读:
    常用颜色
    在VS2010中打开VS2012的项目
    vs2012 断点不能调试
    Setup Factory 打包.netframework 2.0
    Access 中数据库操作时提示from子句语法错误
    vs2012 .netFramwork2.0发布到xp
    c# access插入null值
    Visual Studio安装卸载模板
    Codeforces 455D
    ACdream 1157 (cdq分治)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6235003.html
Copyright © 2011-2022 走看看