在一个程序中开的子线程与父线程通信各种手段都失败了。经调试解决。
问题原因:
在父进程运行pthread_init生成子线程,fork后生成了【子进程】,其中调用了add_alram函数,add_alarm使用线程间通信的方法无法与父进程的pthread通信,因为两个函数隶属不同进程:pthread属于父进程开的某线程,add_alarm属于子进程。
不同【进程】各自有独立的地址空间,故其中的条件变量cond,全局变量flag两个进程各有一个,不会互相影响;信号量sem,套接字sock_fd需要各自独立的初始化。
解决:
在子进程中初始化线程,子线程与add_alarm在同一进程中即可。
期间使用工具:
【由于是同一个.c文件所以用了一部分static 定义变量】
1. 互斥锁mutex(线程互斥)
初始化:
static pthread_mutex_t mutex;
使用:pthread_mutexattr_t mattrs;
pthread_mutexattr_init(&mattrs);
pthread_mutexattr_settype(&mattrs, PTHREAD_MUTEX_ADAPTIVE_NP);
//pthread_mutexattr_settype(&mattrs,PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&mutex, &mattrs);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
注意完整的锁定解锁,避免线程阻塞在锁上。
2. 条件变量cond(线程间通信)
初始化:
static pthread_cond_t cond;
pthread_cond_init(&cond, NULL);
使用:pthread_cond_wait(&cond, &mutex);【阻塞等待】
pthread_cond_timedwait(&cond, &mutex, &first->expires);【非阻塞等待,expire为绝对时间】
pthread_cond_signal(&cond);【单线程唤醒】//pthread_cond_broadcast(&cond);【所有cond上的线程唤醒】
status = pthread_cond_destroy(&cond);
初始化:
static sem_t sem;
使用:sem_init(&sem,0,0);
sem_post(&sem);
sem_wait(&sem);
4. 套接字(进程间通信)
初始化:
static int sock_fd;
static struct sockaddr_in loid;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&loid, 0, sizeof(loid));
loid.sid_family = AF_INET;
loid.sid_port = htons(0);
loid.sid_id = id_any;
if(bind(sock_fd, (struct sockaddr *)&loid, sizeof(loid)) < 0)
printf("bind error.\n");
使用:
sendto(sock_fd, buffer, n, 0, (struct sockaddr *)&loid,sizeof(loid));
recvfrom(sock_fd, buffer, sizeof(buffer), 0, 0, 0);