event(condition variable signal)

来源:互联网 发布:混合高斯算法 编辑:程序博客网 时间:2024/05/21 01:45

Condition variable 相关的function

int pthread_cond_init(          //建立condition variable

 pthread_cond_t *cond,        //要建立的condition variable

 pthread_condattr_t *attr);    //建立的设定  可以给NULL最好


int pthread_cond_wait(     //等待某个condition variable

  pthread_cond_t *cond,    //要等待的condition variable

  pthread_mutex_t *mutex);  //伴随wait所使用的mutex


int pthread_cond_signal(  //通知一个等待的thread

  pthread_cond_t *cond);


int pthread_cond_broadcast(  //通知所有等待的threads

  pthread_cond_t *cond);


int pthread_cond_destroy(pthread_cond_t *cond); //释放

成功 返回0

失败 Error_num > 0

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

用法

#include<stdio.h>

#include<stdlib.h>

#include<pthread.h>

pthread_cont_t g_cond;

pthread_mutex_t g_mutex;

void *aa(void *arg){

  ..

  //做完了 signal通知

  pthread_cond_signal(&g_cond, &g_mutex);


}

main(){

  pthread_t tid;

  //init

  pthread_cond_init(&g_cond, NULL);

  pthread_cond_init(&g_mutex, NULL);

  //建立thread aa

  pthread_create(&tid, NULL, aa, NULL);

  ...

  //等待aa结束

  pthread_cond_wait(&g_cond, &g_mutex);

 //aa做完  可以继续往下做

  ...

  //释放资源

  pthread_cond_destroy(&g_mutex);

  pthread_mutex_destroy(&g_mutex);


}

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

Signal

int sigemptyset(sigset_t *set) //清空

int sigaddset(//加入一个signal 到 set

  sigset_t  *set,   //signal set

  int signum);  //要加入的signal number


int sigdelset(  //从sett中删除一个signal

  sigset_t *set,   //signal set

  int signum);   //要删除的signal number


int sigprocmask(  //设定等待signals

  int how,      //等待方式 SIG_BLOCK SIG_UNBLOCK, SIG_SETMASK)

  const sigset_t *set,  //打算等待的哪些signals(signal set)

  sigset_t *oldest0);  //返回原本的set  可以是NULL


int sigwait(*set, int *sig);  //等待set里面所有的signals

int kill(pid, signum);  //通知某些process ->signum发生

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

Signal 当成event使用

#include<stdio.h>

#include<stdlib.h>

#include<pthread.h>

pthread_cont_t g_cond;

pthread_mutex_t g_mutex;

void *aa(void *arg){


  pid_t ppid=0;

     ..

  //取得parent pid

  ppid = getpid();

  //做完 signal通知

  kill(ppid, SIGUSR1);

}

main(){

  pthread_t tid;  sigset_t set;

  int sig=0;

  //init set(只等待SIGUSR1)

  sigemptyset(&set);

  sigaddset(&set, SIGUSR1);

  sigprocmask(SIG_MASK, &set, NULL);

  //建立thread aa

  pthread_create(&tid, NULL, aa, NULL);

  ...

  //等待aa结束的signal

  sigwait(&set, &sig);

 //aa做完  可以继续往下做

  ...

}