关闭

项目-V0.0.4-线程同步

115人阅读 评论(0) 收藏 举报
分类:


说到线程的问题,说实话,我也有点理不清。

大约知道 操作 共享数据用 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 !!!!

 

 

以上。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2840次
    • 积分:276
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类