首页 > 代码库 > Linux 进程与线程六

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;
}

 

Linux 进程与线程六