有人可以告诉我如何替换这个简单的代码来使用pthread_create而不是fork()吗? 有可能吗?特别是,我遇到了传递给main()的struct * ex的一些问题。 我怎么改变它?
int k=0;
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;
struct primi{
int s;
int temp;};
struct example{
int c;
struct primi primissimi;};
//handler atfork()
void prepare(void){
pthread_mutex_lock(&mutex);}
void parent(void){
pthread_mutex_unlock(&mutex);}
void child(void){
pthread_mutex_unlock(&mutex); }
void *funzione_thread(void* args){
pthread_mutex_lock(&mutex);
struct example *exthread = args;
struct example locale = *exthread;
locale.primissimi.s++;
pthread_mutex_unlock(&mutex);
//do something
pthread_exit(NULL);
}
int ffork(struct example *extmp){
pthread_t id[5];
int i;
while(k<3){
k++;
pthread_create(&id[k],NULL,funzione_thread,extmp);
}
for(i=1;i<=3;i++){
pthread_join( id[i] ,NULL );
printf("waited thread %d\n",i);
}
printf("threads completed\n");
return 1;
}
int main(int argc, char** argv){
struct example *ex = malloc(sizeof(*ex));
int pid,tmp,err;
if ((err = pthread_atfork(prepare, parent, child)) != 0){
printf("can't install fork handlers");
exit(-1);}
pid=fork();
if(pid==0){
ex->c=1;
ex->primissimi.s=1;
if((tmp=ffork(ex))!=1){
printf("error ffork\n");
exit(0);
}
else{printf("ok ffork\n");
pthread_exit (NULL);
}
}
else{
sleep(10);
}
return 1;
}
答案 0 :(得分:5)
fork()
创建了一个新流程,
pthread_create()
产生一个新线程,这两个函数都做了截然不同的事情。过程和线程是不同的
你确定你想要实现的目标吗?
答案 1 :(得分:0)
我认为基本的经验法则是fork()跨越一个进程,该进程不与父程序共享任何数据,而pthread_create()跨越一个线程(在GNU / Linux上,仍然是一个进程),父节目的数据。
有关详细信息,请参阅http://www.makelinux.net/alp/032。
因此,应该可以用pthread_create()调用替换所有fork()调用,因为后者更灵活。
请记住,如果进行更改,则必须更改程序的结构。主要是因为fork() - spanned进程将执行fork()系统调用之后的下一条指令。而对于pthread_create(),您必须将新进程的代码显式封装到函数中。
因此,第一步应该是将fork()命令之后的代码封装到一个独立的函数中,稍后传递给pthread_create()。