当前位置:  技术问答>linux和unix

【求助】两个线程分别读写同一个数组时如何保证同步

    来源: 互联网  发布时间:2017-05-11

    本文导语:  现在遇到的问题是,我现在写的服务器程序中,使用一个short类型的数组,将数据加载到这个数组中。 客户端请求时,请求服务器内存中这个数组的某一段范围的数组元素,服务器端的通信线程就去内存中的这个数...

现在遇到的问题是,我现在写的服务器程序中,使用一个short类型的数组,将数据加载到这个数组中。

客户端请求时,请求服务器内存中这个数组的某一段范围的数组元素,服务器端的通信线程就去内存中的这个数组中取出相应的数据,进行响应。

然而服务器内存中的这个数组中的数据,是动态更新的,也就是在服务器程序中,还有另外一个线程,不断地获得数据,并填入这个数组中的相应位置。

问题的实质就是,一个线程需要不断从一个数组中读取不同下标的元素值,另一个线程需要不断往这个数组中写入不同下标的元素值。我觉得这就要保证对数组元素的互斥访问,但是我想不到用什么方法来实现,如果单纯的对整个数组进行互斥访问很好解决,但是现在的情形不应该这样做。。

数组short DataPoint[1500];

求帮忙,谢谢大家。

|
对每一个数组内的成员区分对待即使实现了,代价也太大了,你还是对整个数组加锁,但是锁的范围要很小,只锁对数组操作的那部分代码,影响不是很大。没关系的。

|
你的问题解决了吗?我们好像是同一个问题

|
  生产者 与消费者模式 建议可以看一下别人的怎么实现的

|


#include 
#include 
#define BUFFER_SIZE 16 // 缓冲区数量
struct prodcons
{
    // 缓冲区相关数据结构
    int buffer[BUFFER_SIZE]; /* 实际数据存放的数组*/
    pthread_mutex_t lock; /* 互斥体lock 用于对缓冲区的互斥操作 */
    int readpos, writepos; /* 读写指针*/
    pthread_cond_t notempty; /* 缓冲区非空的条件变量 */
    pthread_cond_t notfull; /* 缓冲区未满的条件变量 */
};
/* 初始化缓冲区结构 */
void init(struct prodcons *b)
{
    pthread_mutex_init(&b->lock, NULL);
    pthread_cond_init(&b->notempty, NULL);
    pthread_cond_init(&b->notfull, NULL);
    b->readpos = 0;
    b->writepos = 0;
}
/* 将产品放入缓冲区,这里是存入一个整数*/
void put(struct prodcons *b, int data)
{
    pthread_mutex_lock(&b->lock);
    /* 等待缓冲区未满*/
    if ((b->writepos + 1) % BUFFER_SIZE == b->readpos)
    {
        pthread_cond_wait(&b->notfull, &b->lock);
    }
    /* 写数据,并移动指针 */
    b->buffer[b->writepos] = data;
    b->writepos++;
    if (b->writepos >= BUFFER_SIZE)
        b->writepos = 0;
    /* 设置缓冲区非空的条件变量*/
    pthread_cond_signal(&b->notempty);
    pthread_mutex_unlock(&b->lock);

/* 从缓冲区中取出整数*/
int get(struct prodcons *b)
{
    int data;
    pthread_mutex_lock(&b->lock);
    /* 等待缓冲区非空*/
    if (b->writepos == b->readpos)
    {
        pthread_cond_wait(&b->notempty, &b->lock);
    }
    /* 读数据,移动读指针*/
    data = b->buffer[b->readpos];
    b->readpos++;
    if (b->readpos >= BUFFER_SIZE)
        b->readpos = 0;
    /* 设置缓冲区未满的条件变量*/
    pthread_cond_signal(&b->notfull);
    pthread_mutex_unlock(&b->lock);
    return data;
}

/* 测试:生产者线程将1 到10000 的整数送入缓冲区,消费者线
   程从缓冲区中获取整数,两者都打印信息*/
#define OVER ( - 1)
struct prodcons buffer;
void *producer(void *data)
{
    int n;
    for (n = 0; n 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求助java多线程编程!!!!!!!!!!!!!
  • 求助,线程的回收
  • socket实现多文件并发传输,求助多线程实现问题?
  • 求助Linux下怎样查看线程状态?
  • 线程内部的errno问题求助
  • Opengl Linux多线程 求助
  • 求助多线程问题
  • 求助:Linux下线程编程的问题~~~~~~~~~~~~~~~~~~~`
  • 求助:关于单线程recv时的超时问题
  • 求助!Linux下socket编程,服务端与多线程的问题
  • ■■求助■■ 如何查看一个进程拥有的线程数量???
  • 【求助】在主线程里如何终止子线程的执行?
  • 求助!Linux多线程问题
  • 求助!!!多线程+多个epoll_wait问题
  • 求助!pthread与Win32 API线程库的对应问题
  • 【求助】如何使运行中的线程挂起?
  • 求助linux下socket多线程编程的例子(C语言写的)
  • (100分求助)用内核线程对用户进程操作(大侠/虾们出手了)
  • 求助!关于多线程下数据库操作的问题,请大家帮忙看看
  • MM求助:怎样多线程下载http://java.sun.com上的东东? 用http方式,谢谢了.
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助:信号 --13 进程中断


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,