函数功能就是封装pthread_create(),以改变系统默认的栈的大小和地址,原程序如下:
/*test_merge.c*/
#include <pthread.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#define PAGE_SIZE 2UL*1024UL*1024UL
#define ADDR (0x00000000UL)
void thread1(void)
{
int i=11,ret=12;
printf("first variable of thread1 addr = %p
", &i);
printf("first variable of thread1 addr = %p
", &ret);
}
int main(void)
{
pthread_attr_t attr;
pthread_attr_init(&attr); //initialize thread attribute object
pthread_t id;
int i=0,ret;
unsigned long size;
void *stackaddr = NULL;
size_t stacksize = 0;
void *addr = NULL;
addr = malloc(PAGE_SIZE);
printf("addr = %p
",addr);
stacksize = PAGE_SIZE;
ret = pthread_attr_setstack (&attr, addr , stacksize);
if(ret == 0 && errno == 0) printf("thread pthread_attr_setstack success!
");
else
{
printf("ret = %d
",ret);
printf("errno = %d
",errno);
return 1;
}
ret = pthread_create(&id,&attr,(void *)thread1, NULL);
if(ret == 0 && errno == 0)
{
printf("thread %d LPG_pthread_create success!
",i);
}
else
{
printf("thread %d LPG_pthread_create fail!
",i);
printf("ret = %d
",ret);
printf("errno = %d
",errno);
}
pthread_join(id,NULL);
return (0);
}
运行没有问题,线程栈大小和地址都改变了,但是写成共享库就出错,代码如下:
/*my_thread.c*/
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <sys/shm.h>
#include <setjmp.h>
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <string.h>
#define PAGE_SIZE 2UL*1024UL*1024UL
#define ADDR (0x00000000UL)
int my_pthread_create(pthread_t * id, pthread_attr_t * attribute, void * (*start_routine)(void *), void * arg)
{
pthread_attr_t attr;
pthread_attr_init(&attr); //initialize thread attribute object
int i=0,ret;
void *stackaddr = NULL;
size_t stacksize = 0;
int shmid = 0;
void *addr = NULL;
addr = malloc(PAGE_SIZE);
printf("addr = %p
",addr);
stacksize = PAGE_SIZE;
ret = pthread_attr_setstack (&attr, addr , stacksize);
if(ret == 0 && errno == 0) printf("thread pthread_attr_setstack success!
");
else
{
printf("ret = %d
",ret);
printf("errno = %d
",errno);
return 1;
}
ret=pthread_create(id,&attr,(void *)start_routine, NULL);
if(ret == 0 && errno == 0)
{
printf("thread pthread_create success!
");
}
else
{
printf("thread pthread_create fail!
");
printf("ret = %d
",ret);
return 1;
}
return (0);
}
/*my_thread.h*/
#include <pthread.h>
extern int my_pthread_create(pthread_t * id, pthread_attr_t * attr1, void * (*start_routine)(void *), void * arg);
/*test.c*/
#include <sys/types.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include "my_thread.h"
void thread1(void)
{
int i=11,ret=12;
printf("first variable of thread1 addr = %p
", &i);
printf("first variable of thread1 addr = %p
", &ret);
}
int main(void)
{
pthread_t id;
int i=0,ret;
unsigned long size;
ret = my_pthread_create(&id,NULL,(void *)thread1, NULL);
if(ret == 0 && errno == 0)
{
printf("thread %d LPG_pthread_create success!
",i);
}
else
{
printf("thread %d LPG_pthread_create fail!
",i);
printf("ret = %d
",ret);
printf("errno = %d
",errno);
}
pthread_join(id,NULL);
return (0);
}
/*Makefile*/
TEST:
gcc -fpic -c -g my_thread.c
gcc -shared -g -o libmy_thread.so my_thread.o
cp ./libmy_thread.so /lib/
gcc -g test.c -o test -lmy_thread -lpthread
clear:
rm -f *.o libmy_thread.so test
make后运行输出:
addr = 0xb7294008
thread pthread_attr_setstack success!
段错误
但是如果在库里面去掉
ret = pthread_attr_setstack (&attr, addr , stacksize);
这句话,程序就能运行成功.
gdb跟踪进去好象是在allocate_stack()里面调用memset()时出错的,大侠们给我看看吧,谢谢!
|
|