当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : linux下的多线程编程
帖子发表于 : 2008-07-24 17:28 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
最近在学习linux下多线程编程
遇到一个问题:
首先我创建一个 TcpClient.h头文件
其中包含了主要的头文件和类的声明:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <fcntl.h>
#include<netinet/in.h>
#include <sys/types.h>
#include <sys/time.h>
#include<sys/socket.h>
#include <sys/epoll.h>
#include<arpa/inet.h>
class TcpClient
{
public:


int CreateAClient(int epollfd, int serverport,char *argv,struct epoll_event event);
void * epollWaitEvent(void * arg);
int startClientManager(int maxepollsize);
void stopClientManager(int threadid);
};
接着创建一个TcpClient.cpp文件实现函数
void * TcpClient:: epollWaitEvent(void * epfd)
{
int i=*(int *)epfd;
.............................................................................................................
}
int TcpClient::startClientManager(int epollsize)
{
epollfd=epoll_create(maxepollsize);
int err;
pthread_t newthreadid;
err=pthread_create(&newthreadid,NULL,epollWaitEvent,(void *)&epollfd);
if(err!=0)
{
printf("线程创建失败!\n");
return -1;
}
printf("线程创建成功!\n" );
return (newthreadid);


}
void TcpClient:: stopClientManager(int threadid)
{
int n=pthread_join(threadid,NULL);
if(n!=0)
printf("线程关闭失败");
else
printf("线程关闭成功!");
}
问题就出现在红色的几行上,我看了一本书《 BeginningLinux® Programming 4th Edition》
书上谈到了这两个函数间参数的传递,举例:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 6
void *thread_function(void *arg);
int main() {
int res;
pthread_t a_thread[NUM_THREADS];
void *thread_result;
int lots_of_threads;
for(lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) {
res = pthread_create(&(a_thread[lots_of_threads]),NULL, thread_function, (void*)&lots_of_threads);
if (res != 0) {
perror(“Thread creation failed”);
exit(EXIT_FAILURE);
}
sleep(1);
}
printf(“Waiting for threads to finish...\n”);
for(lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0;lots_of_threads--)
{
res = pthread_join(a_thread[lots_of_threads], &thread_result);
if (res == 0) {
printf(“Picked up a thread\n”);
}
else {
perror(“pthread_join failed”);
}
}
printf(“All done\n”);
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
int my_number = *(int *)arg;
int rand_num;
printf(“thread_function is running. Argument was %d\n”, my_number);
rand_num=1+(int)(9.0*rand()/(RAND_MAX+1.0));
sleep(rand_num);
printf(“Bye from %d\n”, my_number);
pthread_exit(NULL);
}


我照书做得但始终编译不过去,唯一的区别就是我把函数封装到类里了
g++ -Wall TcpClient.c -lpthread -o ww

报错:
TcpClient.c: In member function ‘int TcpClient::startClientManager(int)’:
TcpClient.c:44: 错误: 实参类型为 ‘void* (TcpClient::)(void*)’,与 ‘void* (*)(void*)’ 不匹配

望高手指教


_________________
学无止境


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-07-29 14:01 

注册: 2008-01-25 23:12
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
声明
代码:
void * epollWaitEvent(void * arg);

改为
代码:
static void* epollWaitEvent(void * arg);


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-04 15:35 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
geniushui
谢谢,是不是创建一个对象后利用对象调用该函数也可以


页首
 用户资料  
 
4 楼 
 文章标题 : Re: linux下的多线程编程
帖子发表于 : 2008-10-17 11:03 

注册: 2008-10-17 10:22
帖子: 5
送出感谢: 0 次
接收感谢: 0 次
代码:
void * epollWaitEvent(void * arg);

改为
代码:
static void* epollWaitEvent(void * arg);

然后pthread_create(&p_th,NULL,类名::epollWaitEvent,(void *)aa);


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译