免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6484 | 回复: 12
打印 上一主题 下一主题

linux下使用pthread进行多线程编程,出现内存分配问题,请各位指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-07 11:43 |只看该作者 |倒序浏览
最近开始使用linux下的pthread库进行多线程编程,编写了一个很简单的程序,源代码如下:
#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define THREAD_NUM 500

pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count=0;

void * decrement_count(void * arg)
{
  //printf("decrementn");
  pthread_mutex_lock(&count_lock);
  sleep(10);
  while(count==0)
    pthread_cond_wait(&count_nonzero,&count_lock);
  count=count-1;
  printf("This is inside the decrement function: %dn",count);
  pthread_mutex_unlock(&count_lock);
  return NULL;
}

void * increment_count(void * arg)
{
  sleep(10);
  //printf("incrementn");
  pthread_mutex_lock(&count_lock);
  if(count==0)
    pthread_cond_signal(&count_nonzero);
  count=count+1;
  printf("This is inside the increment function: %dn",count);
  pthread_mutex_unlock(&count_lock);
  return NULL;
}

int main(void)
{
  pthread_t thread[THREAD_NUM];
  //void * exit_status;
  memset(thread,0,sizeof(thread));

  pthread_mutex_init(&count_lock,NULL);
  pthread_cond_init(&count_nonzero,NULL);
  int i=0;
  for(i=0;i<THREAD_NUM;i++)
  {
    if(i%2==0)
    {
        if(pthread_create(&(thread[i]),NULL,decrement_count,NULL)!=0)
                perror("decrement ");
    }
    else
    {
        if(pthread_create(&(thread[i]),NULL,increment_count,NULL)!=0)
                perror("increment");
     }
   }
  for(i=0;i<THREAD_NUM;i++)
  {
    if(thread[i]!=0)
    pthread_join(thread[i],NULL);//&exit_status);
  }
  pthread_cond_destroy(&count_nonzero);
  return 0;
}
在红帽9下使用gcc content.c -o content -Wall -lpthread 编译,没有发现任何问题,但是运行的时间,结果却为:
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory
decrement : Cannot allocate memory
increment: Cannot allocate memory

请各位高手给看看是什么原因,好吗?着急期待中,非常感谢

论坛徽章:
0
2 [报告]
发表于 2005-11-07 11:52 |只看该作者
decrement : Cannot allocate memory
increment: Cannot allocate memory
这种消息一共多少个? 500个?

论坛徽章:
0
3 [报告]
发表于 2005-11-07 11:56 |只看该作者
ulimit确定你的系统的限制。
分配一个线程大致要用到1M的栈地址空间,这样内存的地址空间很快就耗尽了,先查一下你的系统的限制。

论坛徽章:
0
4 [报告]
发表于 2005-11-07 13:33 |只看该作者
非常感谢楼上的建议,我修改了一下洪定义,发现如果定义为254,则可以正常运行,如果定义为256,就会输出前面的254行正确信息,然后输出如下两行:
decrement : Cannot allocate memory
increment: Cannot allocate memory
看来楼上的建议是对的。
我现在遇到的问题是程序要求能够创建最多1000个线程,这还距离很远呢,应该怎么做?是否可以将资源给分配的多一点?
谢谢

论坛徽章:
0
5 [报告]
发表于 2005-11-07 14:30 |只看该作者
起4个进程,分别跑250个线程,应该够数目了吧

论坛徽章:
0
6 [报告]
发表于 2005-11-07 15:04 |只看该作者
呵呵,谢谢楼上的建议,也挺不错的。但是我请一个朋友在他的系统上运行了一下,什么异常都没有发生,运行的好好的。我看了一下相关的本地配置文件local_lim.h,看到里面PTHREAD_THREAD_MAX 定义为一万6千多,所以按理说不应该出现问题才对,我现在想知道是怎么回事,是否可以使用setrlimit(我是在《unix高级编程》中看到的,但是不详细,查找不到相关的详细资料,包括使用man)等函数?请各位指点,谢谢了

论坛徽章:
0
7 [报告]
发表于 2005-11-07 15:24 |只看该作者
你限制一下线程默认的栈空间,但是要注意要留足线程内部可能需要的栈大小。
你朋友的机器内存比你的大吧?

论坛徽章:
0
8 [报告]
发表于 2005-11-07 15:31 |只看该作者
谢谢deathbravo  ,不知道能否详细说说如何限制线程默认的栈空间?
谢谢了

论坛徽章:
0
9 [报告]
发表于 2005-11-07 15:35 |只看该作者
另外,我朋友的机器内存和我的一样大,都是256M的,不知道为什么结果差这么远

论坛徽章:
0
10 [报告]
发表于 2005-11-07 15:50 |只看该作者
pthread_t tid;
pthread_attr_t tattr;
int stacksize;
int ret;
ret = pthread_attr_init(&tattr);
stacksize = (PTHREAD_STACK_MIN ); /* 这个尺寸一般不够用,你再看情况增加,数值单位是字节 */
ret = pthread_attr_setstacksize(&tattr, stacksize);
ret = pthread_create(&tid, &tattr, func, arg);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP