多线程之间的通信实例讲解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之间的通信实例讲解相关的知识,希望对你有一定的参考价值。

                 多线程之间的通信实例讲解
对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我
对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码
进行注释,在此过程中,大家也可以对c语言有一个崭新的认识。

第一个函数,创建两个线程。

#include <stdio.h>
#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数
 
  这样在编译的时候,就可以找到此函数的源文件。


void *myThread1(void)   //声明一个指针函数,对于函数指针,和指针函数,对于初学者可能很容易混效,
{   函数指针相当于有一个指针,指向函数, 指针函数,返回值是一个指针类型的。
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 1st pthread,created by zieckey.\n");
        sleep(1);//Let this thread to sleep 1 second,and then continue to run
    }
}

void *myThread2(void)
{
    int i;
    for (i=0; i<100; i++)
    {
        printf("This is the 2st pthread,created by zieckey.\n");
        sleep(1);
    }
}

int main()
{
    int i=0, ret=0;
    pthread_t id1,id2;
   
    /*创建线程1*/      
    ret = pthread_create(&id1, NULL, (void*)myThread1, NULL);在这里我们调用了系统创建线程的函数
    if (ret)    第一个参数,线程id,第二个类型,可以默认,第三个是线程函数,注意是指针类型的!       
    {
        printf("Create pthread error!\n");
        return 1;
    }
   
    /*创建线程2*/
    ret = pthread_create(&id2, NULL, (void*)myThread2, NULL);
    if (ret)
    {
        printf("Create pthread error!\n");
        return 1;
    }
   
    pthread_join(id1, NULL);   线程等待函数,和进程的wait()一样的性质
    pthread_join(id2, NULL);
   
    return 0;
}

 


/*******这个函数实现pthread_join()函数************/


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

void *thread(void *str)
{
    int i;
    for (i = 0; i < 10; ++i)
    {
        sleep(2);
        printf( "This in the thread : %d\n" , i );
    }
    return NULL;
}

int main()
{
    pthread_t pth;
    int i;
    int ret = pthread_create(&pth, NULL, thread, (void *)(i));
   
    pthread_join(pth, NULL);   第一个参数,等待的线程id
    printf("123\n");
    for (i = 0; i < 10; ++i)
    {
        //sleep(1);
        printf( "This in the main : %d\n" , i );
    }
   
    return 0;
}


/***********线程间的执行顺序**************/

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

void *create(void *arg)
{
    printf("new thread is created ... \n");
    return (void *)8;
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;
    void *temp;

    error = pthread_create(&tid, NULL, create, NULL);
    printf("main thread!\n");

    if( error )
    {
        printf("thread is not created ... \n");
        return -1;
    }
    error = pthread_join(tid, &temp);

    if( error )
    {
        printf("thread is not exit ... \n");
        return -2;
    }
   
    printf("thread is exit code %d \n", (int )temp);
    return 0;
}

 

 

/***********测试父进程和子线程的id关系***************/

#include <stdio.h>
#include <pthread.h>
#include <unistd.h> /*getpid()*/

void *create(void *arg)
{
    printf("New thread .... \n");
    printf("This thread‘s id is %u  \n", (unsigned int)pthread_self());
    printf("The process pid is %d  \n",getpid());
    return (void *)0;
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int error;

    printf("Main thread is starting ... \n");

    error = pthread_create(&tid, NULL, create, NULL);

    if(error)
    {
        printf("thread is not created ... \n");
        return -1;
    }
    printf("The main process‘s pid is %d  \n",getpid());
    sleep(1);
    return 0;
}

 

 

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

void *create(void *arg)
{
    char *name;
    name=(char *)arg;
    printf("The parameter passed from main function is %s  \n",name);
    return (void *)0;
}

int main(int argc, char *argv[])
{
    char *a="zieckey";
    int error;
    pthread_t tidp;

    error=pthread_create(&tidp, NULL, create, (void *)a);

    if(error!=0)
    {
        printf("pthread is not created.\n");
        return -1;
    }
    sleep(1);
    printf("pthread is created... \n");
    return 0;
}   

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于多线程之间的通信实例讲解的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程锁的知识实例讲解

多线程和多进程通信原理

多个用户访问同一段代码

详细讲解 —— 多线程初阶认识线程(Java EE初阶)

JUC---06线程间通信

JUC---06线程间通信