- 浏览: 153597 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
今天在进行多线程编程的时候遇到了一个编译问题:error: argument of type ‘void (PIAMW::Communicator::)()’ does not match ‘void* (*)(void*)’
后来发现将线程处理函数声明为static类型,问题得解。
其实这个原因很简单,当把线程函数封装在类中,this指针会作为默认的参数被传进函数中,从而和线程函数参数(void*)不能匹配,不能通过编译。怎么解决呢?网上有一个解决办法,引用过来,自己记着。
摘自:http://hi.chinaunix.net/?uid-11770217-action-viewspace-itemid-48886
将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
#include <iostream>
#include "pthread.h"
using namespace std;
class A;
struct ARG
{
A* pThis;
string var;
};
class A
{
public:
A();
~A();
static void* thread(void* args);
void excute();
private:
int iCount;
};
A::A()
{
iCount = 10;
}
A::~A()
{
}
void* A::thread(void* args)
{
ARG *arg = (ARG*)args;
A* pThis = arg->pThis;
string var = arg->var;
cout<<"传入进来的参数var: "<<var<<endl;
cout<<"用static线程函数调用私有变量: "<<pThis->iCount<<endl;
}
void A::excute()
{
int error;
pthread_t thread_id;
ARG *arg = new ARG();
arg->pThis = this;
arg->var = "abc";
error = pthread_create(&thread_id, NULL, thread, (void*)arg);
if (error == 0)
{
cout<<"线程创建成功"<<endl;
pthread_join(thread_id, NULL);
}
}
int main()
{
A a;
a.excute();
return 0;
}
后来发现将线程处理函数声明为static类型,问题得解。
其实这个原因很简单,当把线程函数封装在类中,this指针会作为默认的参数被传进函数中,从而和线程函数参数(void*)不能匹配,不能通过编译。怎么解决呢?网上有一个解决办法,引用过来,自己记着。
摘自:http://hi.chinaunix.net/?uid-11770217-action-viewspace-itemid-48886
将线程函数作为静态函数,因为在C++中静态函数没有this指针(即在内存中静态函数和普通全局函数几乎没有什么区别),故可以匹配编译通过, 但是当线程函数要访问私有变量呢?可以访问到吗?答案是不可以!
解决方案: 将this指针作为参数传递给静态函数,这样可以通过该this指针访问所有的私有变量, 但是我要是还需要向静态函数中传递我自己需要的参数呢?
答案是:将this指针和需要的参数作为一个结构体一起传给静态函数,请看下面代码:
#include <iostream>
#include "pthread.h"
using namespace std;
class A;
struct ARG
{
A* pThis;
string var;
};
class A
{
public:
A();
~A();
static void* thread(void* args);
void excute();
private:
int iCount;
};
A::A()
{
iCount = 10;
}
A::~A()
{
}
void* A::thread(void* args)
{
ARG *arg = (ARG*)args;
A* pThis = arg->pThis;
string var = arg->var;
cout<<"传入进来的参数var: "<<var<<endl;
cout<<"用static线程函数调用私有变量: "<<pThis->iCount<<endl;
}
void A::excute()
{
int error;
pthread_t thread_id;
ARG *arg = new ARG();
arg->pThis = this;
arg->var = "abc";
error = pthread_create(&thread_id, NULL, thread, (void*)arg);
if (error == 0)
{
cout<<"线程创建成功"<<endl;
pthread_join(thread_id, NULL);
}
}
int main()
{
A a;
a.excute();
return 0;
}
发表评论
-
c++ 动态内存分配
2013-08-28 22:35 845先看一段代码: [cpp] view plaincopy ... -
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1719原文: http://www.ibm.com/develope ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 913Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
atoi源码
2013-05-14 19:32 1262原文: http://blog.csdn.net/eroswa ... -
为重负网络优化 Nginx 和 Node.js
2013-05-13 01:12 1005原文:http://linux.cn/forum.php?mo ... -
c语言特殊字符串复制
2013-05-06 01:59 8642.strcpy和memcpy主要有以下3方面的区别。 2.1 ... -
《APUE》:线程和fork(父子进程锁)
2013-04-29 21:07 1169《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在 ... -
多线程下慎用sigwait
2013-04-29 20:54 792原文:http://blog.chinaunix. ... -
Linux多线程同步的几种方式
2013-04-22 22:49 777Linux多线程同步的几种方式 线程的最大特点是资 ... -
关于linux环境下信号SIGCHLD的排队机制
2013-04-07 22:13 1543下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中 ... -
Linux下的定时器
2013-04-07 20:05 649Linux下的定时器有两种,以下分别介绍: 1、 ... -
ubuntu eclipse 问题
2013-04-05 03:30 791Eclipse 3.6 在 Ubuntu 10.04 下会出现 ... -
linux 信号量
2013-04-04 22:24 669目录 SIGCHLD 描述 编辑本段SIG ... -
makefile例子
2013-04-04 21:29 731CC = gcc CPP = g++ CFLAGS = -g ... -
c++动态内存
2013-04-03 12:00 6581 #include<iostream> ... -
c++模板
2013-04-01 19:08 674c++ 模板不需要分离。即所有东西写在 .h 文件中好了 网上 ... -
开源的一个线程池
2013-03-29 17:06 759/* Thread Pool implementati ... -
static volatile 使用问题
2013-03-29 14:46 1151static volatile int k; 在。h 文件中 ... -
pthread_mutex_destroy 信号量将阻塞!
2013-03-29 11:14 1620#include<stdio.h> 2 #in ... -
linux多线程之pthread_cancel结束线程(防止死锁)
2013-03-28 18:28 1249linux多线程之pthread_cancel结束线程 摘要: ...
相关推荐
C++多线程编程是现代软件开发中的一个重要领域,它允许程序同时执行多个任务,从而提高了效率和响应性。在本资源包中,"c++多线程编译资料.pdf"很可能包含了关于C++标准库中的`<thread>`、同步机制、线程管理以及...
多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。...
通过这份“C++多线程编程实战以及全部源码”,学习者不仅可以理论学习多线程编程,还能通过实际代码加深理解,解决实际问题。源码的分析和调试将有助于掌握多线程的精髓,提升编程能力。在实践中,我们可以学习如何...
根据提供的文件内容,可以提取以下C++多线程编程的知识点: 1. C++多线程编程基础:文档标题“C++多线程入门.pdf”表明文档是关于C++多线程编程的入门级教程。文档描述没有提供更多信息,但可以假设文档会介绍C++多...
对于网络编程和多线程编程的初学者来说,本书是一个极好的起点。而对于希望提高自己多线程网络编程能力的中级开发者,本书中丰富的案例和深入的技术分析,将有助于他们加深理解并提升实践技能。通过本书的学习,读者...
多线程网络编程是C++中的一个重要部分,它允许程序同时处理多个客户端连接,提高应用程序的效率和响应性。本实例专注于C++如何通过Socket进行多线程网络通信。 Socket是网络通信的基础,它提供了一种在不同计算机...
在本文中,我们将深入探讨如何使用C++进行多...通过理解以上概念并结合实际代码实现,你可以构建一个高效且稳定的C++多线程网络聊天程序,不仅能满足多个客户端同时聊天的需求,还能为你的C++和网络编程技能添砖加瓦。
这个"C++11多线程demo"旨在帮助开发者了解和实践C++11中的多线程编程。在本文中,我们将深入探讨C++11中的多线程特性、互斥量的概念以及如何在Ubuntu系统上编译C++11代码。 一、C++11多线程简介 在C++11之前,多...
在IT行业中,C++是一种强大的编程语言,尤其在系统编程、高性能计算以及实时系统...然而,多线程编程也存在挑战,如线程同步问题、资源竞争等,因此在实际开发中,需要谨慎设计和管理线程,以确保程序的稳定性和效率。
这不仅是一个学习SQLite和C++封装的好例子,也是提升多线程编程技能的宝贵资源。 总结来说,这个项目涉及的知识点主要包括: 1. SQLite数据库的基础操作,如创建表、插入数据、查询数据等。 2. C++类的封装技术,将...
在Linux环境下,特别是Fedora操作系统中,使用QT框架进行C++多线程编程是一个常见的需求。QT库提供了丰富的跨平台工具,使得开发人员能够在不同操作系统上编写高效且可移植的代码。本文将深入探讨如何在Linux下利用...
C++11引入了标准库中的`<thread>`,使得多线程编程变得更加方便,同时也为日志处理带来了新的挑战和机遇。 首先,我们来探讨一下C++11的多线程特性。`std::thread`是C++11标准库提供的线程类,允许开发者创建和管理...
本文将深入探讨C++中的面向对象特性以及如何利用这些特性进行多线程编程。 首先,让我们理解C++的面向对象编程(OOP)概念。面向对象编程是一种编程范式,它基于“对象”的概念,每个对象都包含数据(属性)和操作...
4. **多线程编程**:在TCP服务器端,多线程可以用于同时处理多个客户端连接。当一个新连接到来时,服务器创建一个新的线程来处理该连接,主服务线程则继续监听新的请求。这种方式提高了服务器的并发能力,但需要注意...
在Windows编程环境中,Microsoft Foundation Classes (MFC) 是一个C++类库,它为开发者提供了构建桌面应用程序的强大工具。在MFC中实现多线程功能是扩展应用性能、实现并发处理的重要方式。本多线程编程例子将帮助你...
在给定的"C++多线程线程池服务端和客户端例子"中,我们可以深入探讨以下几个关键知识点: 1. **C++11多线程库**: C++11标准引入了`<thread>`库,提供了对多线程的支持。在这个例子中,我们可能会看到如何创建和管理...
标题中的“开源的win32平台c++多线程开发包”指的是一个专门为Windows操作系统(win32 API)设计的C++编程库,它允许开发者使用C++语言进行多线程程序的开发。这个开发包的核心特性就是其开源性,意味着源代码对公众...
这个"VC++多线程编程实例集"是为初学者准备的宝贵资源,它包含了一系列已经编译并成功运行的示例,帮助学习者理解和掌握多线程技术。 多线程是计算机程序设计中的一个重要概念,它允许一个应用程序同时执行多个独立...
在VC6.0环境下开发,需要注意的是,尽管这是一个较老的IDE,但依然可以支持多线程编程。不过,相比现代的C++编译器(如Visual Studio 2019或更新版本),它可能缺乏一些现代C++和MFC的特性。开发者需要手动管理更多...