免费注册 查看新帖 |

Chinaunix

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

再论捕获和处理线程栈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-26 11:49 |只看该作者 |倒序浏览
接http://bbs.chinaunix.net/forum/viewtopic.php?t=504312&show_type=&start=0&postdays=0&postorder=asc&highlight=

为什么pthread_attr_getstackaddr不能正常工作,线程栈的地址得不到,我认为 man给出了答案…………IEEE Std 1003.1-2001 has introduced the new interfaces pthread_attr_setstack() and pthread_attr_getstack() to resolve these ambiguities.至于double A[N][N],我不知道为什么需要,我没有用它。为什么进程开始的时候,用函数pthread_attr_getstack得到进程的 stackaddr为nil值,stack size为0,但是在子线程中使用该函数却正常,                                                                                                                                    不知道是不是和线程库的设计有关,请高手指教。

这是我给楼主修改过后的程序,在fedora 2上编译通过,运行正常。
附上修改后的程序代码:
#include <pthread.h>;
#include <stdio.h>;
#include <errno.h>;
#include <sys/shm.h>;
#include <unistd.h>;
#include <sys/ipc.h>;
#include <stdlib.h>;
#include <string.h>;
                                                                                                                                          
#define PAGE_SIZE 4UL*1024UL*1024UL
                                                                                                                                          
pthread_attr_t attr;
                                                                                                                                          
void *dowork(void *threadid)
{
       int i;
       printf("in thread one local variable i at address %p\n", &i);
       size_t mystacksize = 0;
       void *child_address = NULL;
       pthread_attr_getstack(&attr,&child_address,&mystacksize);
       printf("Child thread stack size = %d\n", mystacksize);
       printf("Child thread address:%p\n",child_address);
       pthread_exit(NULL);
}
                                                                                                                                          
int main(int argc, char *argv[])
{
       int shmid = 0;
       void *addr = NULL, *address = NULL;
       pthread_t threads;
       size_t stacksize = 0;
       int t = 0, rc = 0;
                                                                                                                                          
       pthread_attr_init(&attr);
       pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
                                                                                                                                          
       pthread_attr_getstack(&attr, &address, &stacksize);
       printf("Default address:%p\n",address);
       printf("Default stack size = %d\n", stacksize);
       /*这里使用pthread_attr_getstack得到进程adress为nil,stack size为0,但是子线程中该函数使用却正常*/
       pthread_attr_getstacksize(&attr,&stacksize);
       printf("Default stack size = %d\n", stacksize);
                                                                                                                                          
       stacksize = PAGE_SIZE;
       printf("New stack size = %d\n", stacksize);
                                                                                                                                          
       pthread_attr_setstack(&attr, addr, stacksize);/*重新设置线程栈*/
       printf("resent stack size = %d\n", stacksize);
       printf("resent addr:%p\n",addr);
                                                                                                                                          
       rc = pthread_create(&threads,&attr,dowork,(void *)t);
       if(rc)
       {
               perror("pthread_create:";
               exit(EXIT_FAILURE);
       }
       pthread_join(threads, NULL);
       shmdt(addr);
       shmctl(shmid, IPC_RMID, NULL);
       pthread_attr_destroy(&attr);
       sleep(1);
       pthread_exit(NULL);
}


有不正确的地方,请大家指正!!

论坛徽章:
0
2 [报告]
发表于 2005-03-26 11:56 |只看该作者

再论捕获和处理线程栈

完整的程序代码应该如下:
#include <pthread.h>;
#include <stdio.h>;
#include <errno.h>;
#include <sys/shm.h>;
#include <unistd.h>;
#include <sys/ipc.h>;
#include <stdlib.h>;
#include <string.h>;
                                                                                                                                             
#define PAGE_SIZE 4UL*1024UL*1024UL
                                                                                                                                             
pthread_attr_t attr;
                                                                                                                                             
void *dowork(void *threadid)
{
        int i;
        printf("in thread one local variable i at address %p\n", &i);
        size_t mystacksize = 0;
        void *child_address = NULL;
        pthread_attr_getstack(&attr,&child_address,&mystacksize);
        printf("Child thread stack size = %d\n", mystacksize);
        printf("Child thread address:%p\n",child_address);
        pthread_exit(NULL);
}
                                                                                                                                             
int main(int argc, char *argv[])
{
        int shmid = 0;
        void *addr = NULL, *address = NULL;
        pthread_t threads;
        size_t stacksize = 0;
        int t = 0, rc = 0;
                                                                                                                                             
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
                                                                                                                                             
        pthread_attr_getstack(&attr, &address, &stacksize);
        printf("Default address:%p\n",address);
        printf("Default stack size = %d\n", stacksize);
        /*这里使用pthread_attr_getstack得到进程adress为nil,stack size为0,但是子线程中该函数使用却正常*/
        pthread_attr_getstacksize(&attr,&stacksize);
        printf("Default stack size = %d\n", stacksize);
                                                                                                                                             
        stacksize = PAGE_SIZE;
        printf("New stack size = %d\n", stacksize);
                                                                                                                                             
        shmid = shmget(1234, stacksize, IPC_CREAT | 0600);
        printf("shmid:%d\n",shmid);
        if(shmid != -1)
        {
                addr = shmat(shmid, NULL, 0);
                printf("New address:%p\n",addr);
        }
                                                                                                                                             
        pthread_attr_setstack(&attr, addr, stacksize);/*重新分配线程栈*/
        printf("resent stack size = %d\n", stacksize);
        printf("resent addr:%p\n",addr);
                                                                                                                                             
        rc = pthread_create(&threads,&attr,dowork,(void *)t);
        if(rc)
        {
                perror("pthread_create:";
                exit(EXIT_FAILURE);
        }
        pthread_join(threads, NULL);
        shmdt(addr);
        shmctl(shmid, IPC_RMID, NULL);
        pthread_attr_destroy(&attr);
        sleep(1);
        pthread_exit(NULL);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP