linux多线程程序

这里是多线程,而不是多进程。我们用fork函数可以创建子进程,创建的子进程是和源程序完全一样的,但是有自己的堆栈,代码段,数据段,BSS端,而且当源进程关闭的时候,创建的新进程不会关闭,就相当于是复制出完全一样的两个程序在运行。

但是这里的线程就不一样了。它在源程序里创建了一个新线程,这个线程不是源程序的完全复制,它和源程序共用同个资源,是源程序为了提高效率让多个线程同时执行某一项操作。

相关函数
创建线程   pthread_create
等待线程   pthread_join 
结束线程   pthread_exit

相关辅助函数(线程互斥锁)
当多个线程对同一个公共资源进行操作时,就会碰到和多进程是一样的问题,多个线程不能同时对同一个资源进行访问操作,在进程间通信时用的是信号量来实现进程间互斥,这里用线程互斥锁。
初始化线程互斥锁   pthread_mutex_init
获取线程互斥锁       pthread_mutex_lock
解开线程互斥锁       pthread_mutex_unlock
用pthread_mutex_t mymutex,可以定义一个mymutex的互斥锁,用 pthread_mutex_init来初始化这个互斥锁, pthread_mutex_lock和 pthread_mutex_unlock分别为加锁和解锁

如果man不到这些函数
linux多线程程序
安装manpages_posix-dev就可以了
sudo apt-get install manpages-posix-dev
linux多线程程序

linux多线程程序


举个例子
当两个线程是这样的
void * work1()
{
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
     
    pthread_exit(NULL);
}

void * work2()
{
    printf("num 3\n");
     
    pthread_exit(NULL);    
}
显示的结果是
linux多线程程序

当加入互斥锁后
void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);    
}
结果就变成这样了
linux多线程程序
注意:这里要两个函数里都用互斥锁,如果只有一个用是不会锁起来的


void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
     
    sleep(2);
     
    pthread_mutex_lock(&mut);
    printf("num 4\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);    
}
linux多线程程序


贴上所有代码
#include
#include

pthread_t thread[2];

int number = 0;
pthread_mutex_t mut;

void * work1()
{
    pthread_mutex_lock(&mut);
    printf("num 1\n");
    sleep(1);
    printf("num 2\n");
    pthread_mutex_unlock(&mut);
     
    sleep(2);
     
    pthread_mutex_lock(&mut);
    printf("num 4\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);
}

void * work2()
{
    pthread_mutex_lock(&mut);
    printf("num 3\n");
    pthread_mutex_unlock(&mut);
     
    pthread_exit(NULL);    
}

void main()
{
    pthread_mutex_init(&mut, NULL);

    //创建工人1线程
    pthread_create(&thread[0], NULL, work1, NULL);
   
    //创建工人2线程
    pthread_create(&thread[1], NULL, work2, NULL);
   
    //等待工人1线程的结束
    pthread_join(thread[0], NULL);
   
    //等待工人2线程的结束
    pthread_join(thread[1], NULL);
}




多线程之间还可以用条件变量来减少等待线程对CPU的占用

初始化

pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

等待条件成熟

pthread_cond_wait(&cond_ready, &mut);

设置条件成熟

pthread_cond_signal(&cond_ready);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值