- 浏览: 146466 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 782先看一段代码: [cpp] view plaincopy ... -
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1670原文: http://www.ibm.com/develope ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 872Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
atoi源码
2013-05-14 19:32 1223原文: http://blog.csdn.net/eroswa ... -
为重负网络优化 Nginx 和 Node.js
2013-05-13 01:12 953原文:http://linux.cn/forum.php?mo ... -
c语言特殊字符串复制
2013-05-06 01:59 8262.strcpy和memcpy主要有以下3方面的区别。 2.1 ... -
《APUE》:线程和fork(父子进程锁)
2013-04-29 21:07 1108《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在 ... -
多线程下慎用sigwait
2013-04-29 20:54 762原文:http://blog.chinaunix. ... -
Linux多线程同步的几种方式
2013-04-22 22:49 736Linux多线程同步的几种方式 线程的最大特点是资 ... -
关于linux环境下信号SIGCHLD的排队机制
2013-04-07 22:13 1490下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中 ... -
Linux下的定时器
2013-04-07 20:05 612Linux下的定时器有两种,以下分别介绍: 1、 ... -
ubuntu eclipse 问题
2013-04-05 03:30 741Eclipse 3.6 在 Ubuntu 10.04 下会出现 ... -
linux 信号量
2013-04-04 22:24 622目录 SIGCHLD 描述 编辑本段SIG ... -
makefile例子
2013-04-04 21:29 674CC = gcc CPP = g++ CFLAGS = -g ... -
c++动态内存
2013-04-03 12:00 6231 #include<iostream> ... -
c++模板
2013-04-01 19:08 643c++ 模板不需要分离。即所有东西写在 .h 文件中好了 网上 ... -
开源的一个线程池
2013-03-29 17:06 736/* Thread Pool implementati ... -
static volatile 使用问题
2013-03-29 14:46 1112static volatile int k; 在。h 文件中 ... -
pthread_mutex_destroy 信号量将阻塞!
2013-03-29 11:14 1582#include<stdio.h> 2 #in ... -
linux多线程之pthread_cancel结束线程(防止死锁)
2013-03-28 18:28 1185linux多线程之pthread_cancel结束线程 摘要: ...
相关推荐
多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。...
C++ 多线程编程实战以及全部源码. 编译工具vs2013
linux epoll多线程编程实例,在Linux下编译通过
这是我在学校C++多线程编程时编译的一个经典程序,里面的代码都已运行过,没有问题,大家可以放心用,希望对大家有所帮助
第7 章介绍编译和调试多线程应用程序的基本信息。 第8 章介绍Solaris 线程(与POSIX 线程相对)接口。 第9 章讨论会影响程序员编写多线程应用程序的问题。 附录A 说明如何为POSIX 线程设计代码。 附录B 举例说明如何...
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
第三部分 C++Builder高级编程技术 C++Builder 高级编程技术包括:数据共享、操作注册表、帮助系统的制作、安装与卸载、多线程应用程序、动态链接库和图形与多媒体等技术。 第四部分 数据库编程数据库编程部分包括:...
第三部分 C++Builder高级编程技术 C++Builder 高级编程技术包括:数据共享、操作注册表、帮助系统的制作、安装与卸载、多线程应用程序、动态链接库和图形与多媒体等技术。 第四部分 数据库编程数据库编程部分包括:...
3.6 一个多线程的垃圾回收器 78 3.6.1 附加的成员变量 79 3.6.2 多线程的GCPtr构造函数 79 3.6.3 TimeOutExc异常 81 3.6.4 多线程的GCPtr析构函数 81 3.6.5 gc()函数 82 3.6.6 isRunning()函数 82 3.6.7 gclist的...
rk3588rk3588s使用c++多线程异步等优化c++实现源码(yolov5运行可达到135fps)+项目使用说明.zip 【资源介绍】 该项目为c++实现, 大体改自rknpu2 使用线程池异步操作rknn模型, 提高rk3588/rk3588s的NPU使用率, 进而...
1.基于Dev-C++ 5.x的改进版,GCC 4.8.4内核。2.基于opengl三维动画引擎,实现三维图形、动画的绘制(类似于logo语言)。3.支持代码的数据库管理...7.支持多线程编程。8.封装控制台用的游戏函数。9.自带评测机功能......
本文实例为大家分享了C++多线程实现电子词典的具体代码,供大家参考,具体内容如下 // Dictionary.cpp : 定义控制台应用程序的入口点。 //vs2013编译 //字典文件:https://pan.baidu.com/s/1YHtwptaq_V8j034U9_J96A ...
pthread资源包,pthread源码和已经编译好的VS2019_x64版本 #include pthread_t newThread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); pthread_attr_...
第一课 Windows编程和面向对象技术 1.1 Windows发展历史 ...第十二章 多线程与串行通信 12.1 多任务、进程和线程 12.2 线程的同步 12.3 串行通信与重叠I/O 12.4 一个通信演示程序 12.5 小结
本压缩包包含了开发实例的所有程序源码,所有程序源码都是在Visual C++.NET上编译通过的。主要内容:界面编程;图像和多媒体编程;对话框与控件编程;文件与系统编程;线程操作与COM组件编程;网络和数据库编程;...
实现功能:Socket通信,分为客户端和服务端两个程序,实现客户端与服务端间的通信,功能包括 1)客户端请求得到服务端的当前时间和主机名称; 2)客户端请求得到所有与服务端连接的其他... Windows 下多线程编程等
c++写的多线程聊天程序,可以实现一对一的聊天,涉及的技术有c++网络编程,c++多线程,c++ STL, 压缩包里有服务器和客户端的源码,也有编译好的两个exe程序,环境使用vs2013编译的
第一课 Windows编程和面向对象技术 1.1 Windows发展历史 ...第十二章 多线程与串行通信 12.1 多任务、进程和线程 12.2 线程的同步 12.3 串行通信与重叠I/O 12.4 一个通信演示程序 12.5 小结
案例涵盖基础问题、编译问题、库函数问题、文件处理、类和对象、内存使用、多线程问题、性能问题等。读者每掌握一个案例就掌握了一个或几个知识点,就能避免一类问题。由于是从大量编程中总结出来的具体Bug案例中...
并发/并行编程中多线程编译占有重要的地位,编写一份线程安全的程序即使对于一名经验丰富的开发人员也是一种挑战。本文将通过详解线程安全的上的相关概念,确定出一系列的原则,帮忙多线程程序的开发人员能够容易的...