说到线程的问题,说实话,我也有点理不清。
大约知道 操作 共享数据用 MUTEX锁起
挂起等信号用COND
一般是
pthread_mutex_lock(&mutex);
……
pthread_cond_wait(&cond,&mutex); //其中是不是包含了一个解锁,等待的操作,等到了继续锁上?
……
pthread_mutex_unlock(&mutex);
所以,项目中的需求是这样的,一个优先队列Q,线程A:从本地读数据push到Q中,线程B:从WIFI读数据push到Q中,线程C:从Q中pop数据发送到网络对端。
所以,当A、B、C对Q进行操作的时候,就要拿到互斥锁。
大约的模拟方式,就是用一个全局静态变量i表示共享数据,线程A对i--,线程B和线程C对i++;
以下是代码
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#define MAX 100000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static int i =0;
void * funA(void * arg)
{
unsigned int k =MAX;
while(k--)
{
pthread_mutex_lock(&mutex);
if(i==0)
{
cout<<"i==0"<<endl;
pthread_cond_wait(&cond,&mutex);
}
i--;
pthread_mutex_unlock(&mutex);
sleep(1)
}
}
void * funB(void * arg)
{
unsigned int k =MAX;
while(k--)
{
pthread_mutex_lock(&mutex);
if(i==0)
{
i++;
pthread_cond_signal(&cond);
}
i++;
cout<<i<<"___B"<<endl;
pthread_mutex_unlock(&mutex);
sleep(10)
}
}
void * funA(void * arg)
{
unsigned int k =MAX;
while(k--)
{
pthread_mutex_lock(&mutex);
i++;
cout<<i<<"___C"<<endl;
pthread_mutex_unlock(&mutex);
sleep(10)
}
}
int main(void)
{
pthread_t id1,id2,id3;
int res;
res= pthread_create(&id1,NULL,funA,NULL);
res= pthread_create(&id2,NULL,funB,NULL);
res= pthread_create(&id3,NULL,funC,NULL);
res = pthread_join(id1,NULL);
res = pthread_join(id2,NULL);
res = pthread_join(id3,NULL);
}
注意:编译连接的时候要带上 -lpthread !!!!
以上。