/************************************************
** 本实例演示了两个线程,通过信号量进行同步,
** 这种方法简化了软件处理流程,可以用于请求应答机制。
************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/ipc.h>
#include <semaphore.h>
int lock_var;
sem_t sem;
/*void event_thread(void *arg)
{
while(1)
{
printf("event_thread send req, wait ack...\n");//发送请求
sem_wait(&sem);//等待信号量,线程阻塞在这里
printf("event_thread got ack!!!\n\n");//线程继续进行
}
}*/
void event_thread(void *arg)
{
while(1)
{
printf("event_thread send req, wait ack...\n");//发送请求
struct timespec ts;
if ( clock_gettime( CLOCK_REALTIME, &ts ) < 0 )
{
return;
}
//ts.tv_sec=time(NULL)+3;
ts.tv_sec += 3;
int ret = sem_timedwait(&sem, &ts);//等待信号量,线程阻塞在这里,如果等待超时,则继续向后执行
if(ret == -1)
{
printf("event_thread wait timeout!!!\n\n");//等待信号量超时,但线程继续进行
}
else
{
printf("event_thread got ack!!!\n\n");//获得信号量,线程继续进行
}
}
}
void io_thread(void *arg)
{
while(1)
{
sleep(4);
printf("io_thread got ack\n");//收到响应
sem_post(&sem);//发送信号量
printf("io_thread post sem\n");
}
}
//两个线程,一个事务线程,一个IO线程
int main(int argc, char *argv[])
{
pthread_t id1, id2;
pthread_t mon_th_id;
int ret;
ret = sem_init(&sem, 0, 0);
if(ret != 0)
{
perror("sem_init");
}
ret = pthread_create(&id1, NULL, (void *)event_thread, NULL);
if(ret != 0)
{
perror("pthread cread1");
}
ret = pthread_create(&id2, NULL, (void *)io_thread, NULL);
if(ret != 0)
{
perror("pthread cread2");
}
pthread_join(id1, NULL);
pthread_join(id2, NULL);
exit(0);
}
Linux使用信号量同步请求、应答线程
最新推荐文章于 2022-03-03 09:07:30 发布