有这么一个类classMyClass{private:staticchardata[99];staticunsignedint__stdcallthread_server(void*p);staticunsignedint__stdcallthread_client(void*p);public:voidrun_server(...
有这么一个类
class MyClass
{
private:
static char data[99];
static unsigned int __stdcall thread_server(void *p);
static unsigned int __stdcall thread_client(void *p);
public:
void run_server();// 开启服务端线程
void run_client();// 开启客户端线程
};
在thread_server与thread_client中对data进行操作。
在编译时貌似只有把这两个函数都设成静态的,才能做为线程运行。但设成了静态之后在线程函数中只能访问静态成员变量,所以只能把data也设成静态的。而这样做的话,就算生成了不同的对象,他们都只能共用一个data,而不是各自维护各自的data。
请问有什么办法可以让每个对象拥有自己的data让线程自由读取吗?即让data变成非静态变量。
我有想过这么一种做法,data为非静态变量,通过传参的方式把data传给相应的线程,这样的话可以每个对象维护自己的data。但这样的话线程的参数就被data占用,无法传入其他有效信息,而且当线程要读取的数据不止data,比如又多了个int num;的时候,传参也会非常的不方便。
另一种做法是开辟一块静态内存,用来保存线程中要访问的各变量,在开启线程之前先把对象自己的参数设到静态内存中就可以在线程里自由地对变量进行操作,这样也可以使得每个对象拥有自己的data,但这样做的话就必须对静态内存进行互斥保护,在开启线程前也得进行变量复制,极大降低了程序的运行效率。
大家如果有比较好的解决方法,希望可以拿出来分享一下,谢谢!
我纠结的地方主要在于传参,举个例子来说(或许有点勉强,见谅~):
QQ那有好友列表的窗体是主程序,可以用客户线程创出一个对话窗口也可以通过服务线程接收各种网络消息(这两个线程都处于主程序之中)。当我用一个客户线程建出了一个聊天窗口时,它需要获得两种信息:
1.自己窗口上各种文字表情的显示(这需要获得聊天窗口的指针)
2.主程序是否处于在线状态(这需要获得主程序的指针)
这样的话为了让线程得到以上两个指针我还需要另外写一个对象或结构体,让该对象包含这两个指针,再将指针做为参数传给线程。
而我希望得到的结果是,线程能自由地访问主程序的成员变量(因为线程函数是主程序的一个成员函数),这样的话在创建线程时就可以只传入聊天窗口的指针,而不用再另外写一个对象把两种指针都包含进去再传参
PS:万恶的追问&评论字数限制~ T_T
展开