线程、进程间通信


       <<<<<<<线程>>>>>>>

#include <pthread.h>

函数:

 【创建线程:】

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arrg);

thread:线程标示符

attr:线程属性设置

routine:线程函数的起始地址,指向void的指针作为参数和返回值的函数指针

attr:传递给routine的参数

    <<成功:0   错误:错误代码>>

      pthread_attr_setdetachstatepthread_attr_t *attr, int detachstate);

           detachstate:PTHREAD_CREATE_DETACHED(分离线程)

                         PTHREAD _CREATE_JOINABLE(非分离线程)

  创建分离线程的步骤

     pthread_t  tid;

    pthread_attr_t  attr;

    pthread_attr_init(&attr);

    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    pthread_create(&tid, &attr, THREAD_FUNCTION, arg);

 【线程退出函数:】

int pthread_exit(void *retval);

retval:线程结束时的返回值,由其他函数pthread_join()来获取


 【回收线程:】

int pthread_join(pthread_t th, void **thread_return);

th:等待线程的标示符

thread_return:用来接收pthread_exit()函数的指针

    <<成功:0   错误:错误代码>>



-------------------------------------------------------------------------------------------

//创建一个线程并使线程完成相应的工作:

No.1:pthread_t id1,

No.2:ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);

No.3:pthread_join (id1, NULL);

-------------------------------------------------------------------------------------------


       <<<<<<<Linux线程间的同步:信号量(无名信号)>>>>>>>

    函数:

 【信号量初始化函数:】

int sem_init(sem_t *sem, int pshared, unsigned int value);

sem:信号量指针

pshared:决定信号量能在几个进程间共享,0:多线程同步,>0多进程同步

目前Linux还没实现进程间信号量的共享,所以取0;

<<成功:0   失败:-1>>


 【P、V操作; 其他函数】

int sem_wait(sem_t *sem);//P操作 sem-1

int sem_pos(sem_t *sem);//V操作 sem+1

int sem_trywait(sem_t *sem);//非阻塞,出错返回非零,若阻塞返回EAGAIN

int sem_getvalue(sem_t *sem);//获取sem值

int sem_destroy(sem_t *sem);//回收

<<成功:0   失败:-1>>


-------------------------------------------------------------------------------------------------

//测试程序:线程1工作时线程2阻塞,线程2工作时线程1阻塞,周而复始(无名信号量)

No.1: 定义信号量并初始化:

    sem_t sem1, sem2;

    ret = sem_init (&sem1, 0, 1);//初始化信号量1为资源可用

    ret = sem_init (&sem2, 0, 0);//初始化信号量2为资源不可用

No.2:定义两个线程并初始化:

    pthread id1, id2;

    ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);

//创建线程1(id1)并选择线程执行函数

    ret = pthread_create (&id2, NULL, (void *) pthread2, NULL);

//创建线程2(id2)并选择线程执行函数

No.3:线程一种:

    sem_wait (&sem2);  //P操作

    具体操作内容

    sem_post (&sem1);//V操作

No.4:线程二种:

    sem_wait (&sem1);  //P操作

    具体操作内容

    sem_post (&sem2);//V操作

No.5:回收线程

    pthread_join (id1, NULL);//回收线程1(id1)

    pthread_join (id2, NULL);//回收线程2(id2)


-------------------------------------------------------------------------------------------------------------

       <<<<<<<Linux线程间的互斥:互斥锁>>>>>>>

#include<pthread.h>

函数:

 【初始化互斥锁:】

int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr);

mutex:互斥锁

mutexattr

PTHREAD_MUTEX_INITIALIZER:快速创建互斥锁

PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁

PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁

<<成功:0   错误:错误代码>>


 【申请、释放、回收互斥锁:】

int pthread_mutex_lock(pthread_mutex_t *mutex);//申请互斥锁

int pthread_mutex_lock(pthread_mutex_t *mutex);//非阻塞申请

int pthread_mutex_unlock(pthread_mutex_t *mutex);//释放互斥锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);//回收锁

<<成功:0   失败:-1>>


-------------------------------------------------------------------------------------------------------------

//测试程序,静态互斥锁(全局)

No.1:定义全局变量:互斥锁

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

N0.2:定义两个线程并初始化;互斥锁初始化

    pthread_t id1, id2;

    ret = pthread_create (&id1, NULL, (void *) pthread1, NULL);

    ret = pthread_create (&id2, NULL, (void *) pthread2, NULL);

No.3:线程一:

    申请互斥锁:if (pthread_mutex_lock (&mutex) < 0){perror}

    进行操作内容

    释放互斥锁:if (pthread_mutex_unlock (&mutex) < 0){perror}

No.4:线程二:

    申请互斥锁:ret = pthread_mutex_trylock (&mutex)if(ret != 0){perror}

    进行操作内容

    释放互斥锁:if (pthread_mutex_unlock (&mutex) != 0){perror}

No.5:

    pthread_join (id1, NULL);//回收线程

    pthread_join (id2, NULL);//回收线程 

    pthread_mutex_destroy (&mutex);//回收 


-------------------------------------------------------------------------------------------------------------

// 动态初始化

No.1:定义全局锁(全局变量)

    pthread_mutex_t mutex;

N0.2:定义两个线程;互斥锁初始化;线程初始化

    pthread_mutexattr_init (&mutexattr);

    pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_TIMED_NP);//快速互斥锁

No.3:线程一:

    if (pthread_mutex_lock (&mutex) < 0) {perror}

    进行操作内容

    if (pthread_mutex_unlock (&mutex) < 0) {perror}

No.4:线程二:

    ret = pthread_mutex_trylock (&mutex);if (ret == EBUSY){perror}

    进行操作内容

    if (pthread_mutex_unlock (&mutex) != 0) {perror}

No.5:

    pthread_mutex_destroy (&mutex);


-------------------------------------------------------------------------------------------------------------




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值