linux多线程编程

目录

  • 编译
  • 代码
    • 头文件
    • 多个线程调用一个函数
    • 多个进程多个函数
    • 互斥锁

编译

gcc pth.c -lpthread -o pth

代码

头文件

#include 

多个线程调用一个函数

#include 
#include 
#include 

//线程要运行的函数,除了函数名myfunc,其他全都是固定的。
void* myfunc()
{
    printf("Hello World!\n");
    return NULL;
}

int main()
{
    pthread_t th;//在创建线程之前要先定义线程标识符th,相当于int a这样

    pthread_create(&th,NULL,myfunc,NULL);
    /*第一个参数是要创建的线程的地址
    第二个参数是要创建的这个线程的属性,一般为NULL
    第三个参数是这条线程要运行的函数名
    第四个参数三这条线程要运行的函数的参数*/
    
    pthread_join(th,NULL);
    /*线程等待函数,等待子线程都结束之后,整个程序才能结束
    第一个参数是子线程标识符,第二个参数是用户定义的指针用来存储线程结束时的返回值*/
    return 0;
}

#include 
#include 
#include 

void* myfunc(void* args)
{
    int i;
    //由于“th1”是字符串,所以这里我们要做个强制转换,把void*强制转换为char*
    char* name = (char*) args;
    for(i=1;i<50;i++)
    {
        printf("%s:%d\n",name,i);

    }
    return NULL;
}

int main()
{
    pthread_t th1;
    pthread_t th2;

    pthread_create(&th1,NULL,myfunc,"th1");//pthread_create的第四个参数是要执行的函数的参数哦!~
    //这里的“th1”就是void* args
    pthread_create(&th2,NULL,myfunc,"th2");

    pthread_join(th1,NULL);
    pthread_join(th2,NULL);
    return 0;
}

多个进程多个函数

#include 
#include 
#include 
int arr[5000];
int s1=0;
int s2=0;
void* myfunc1(void* args)
{
    int i;
    
    for(i=0;i<2500;i++)
    {
        s1 = s1 + arr[i];

    }
    return NULL;
}
void* myfunc2(void* args)
{
        int i;
 
        for(i=2500;i<5000;i++)
        {
                s2 = s2 + arr[i];
 
        }
        return NULL;
 }


int main()
{
    //初始化数组
    int i;
    for(i=0;i<5000;i++)
    {
        arr[i] = rand() % 50;

    }
    
    /*  for(i=0;i<5000;i++)
    {
        printf("a[%d]=%d\n",i,arr[i]);
    }*/
    pthread_t th1;
    pthread_t th2;

    pthread_create(&th1,NULL,myfunc1,NULL);
    pthread_create(&th2,NULL,myfunc2,NULL);

    pthread_join(th1,NULL);
    pthread_join(th2,NULL);
    
    printf("s1=%d\n",s1);
    printf("s2=%d\n",s2);
    printf("s1+s2=%d\n",s1+s2);
    return 0;
}

互斥锁

#include 
#include 
#include 
pthread_mutex_t lock;//定义一个互斥锁
int s = 0;


void* myfunc(void* args)
{
    int i = 0;
    pthread_mutex_lock(&lock);//这个函数表示,在这个地方上一个锁,就是摆一个锁在这个地方

    for(i=0;i<100000;i++)
    {
        s++;
    }
    pthread_mutex_unlock(&lock);//把这个锁给解掉

    return NULL;
}

int main()
{
    pthread_t th1;
    pthread_t th2;

    pthread_mutex_init(&lock,NULL);//初始化这个锁,此时只是创建了这个锁而已,还没有加进去哦。
    /*锁不是用来锁一个变量,它是用来锁住一段代码的。*/
    
    pthread_create(&th1,NULL,myfunc,NULL);
    pthread_create(&th2,NULL,myfunc,NULL);
    
    pthread_join(th1,NULL);
    pthread_join(th2,NULL);

    printf("s = %d\n",s);
    return 0;
}

你可能感兴趣的:(Linux,C语言,linux,c语言)