- 论坛徽章:
- 0
|
再论捕获和处理线程栈
完整的程序代码应该如下:
#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);
} |
|