多线程程序中为了防止线程并发造成的竞态,需要经常使用到Mutex进行数据保护。posix提供了phtread_mutex_t进行互斥保护数据。Mutex的使用需要初始化和释放对应(phtread_mutex_init() 和 phtread_mutex_destroy() 对应),上锁和解锁对应(phtread_mutex_lock 和 pthread_mutex_unlock对应)。lock和unlock的过程是设计逻辑的一部分一般都程序员都能正确的进行加锁和解锁对应,但是要防止lock之后程序出现异常或者提前return而没有...
目录noncopyable.hthread.hthread.cctestnoncopyable.h#ifndef __WD_NONCOPYABLE_H__
#define __WD_NONCOPYABLE_H__namespace wd
{class Noncopyable
{
protected:Noncopyable(){}~Noncopyable(){}
private:Noncopyable(const Noncopyable&);Noncopyable & operator=(const Noncopyable &);
};}//end of namespace wd#endif
thread.h#ifndef __WD_MUTEXLOCK_H__
#define __WD_MUTEXLOCK_H__
<br>#include "Noncopyable.h"
#include...
说明1.内存大小自动适应字符串长度。
2.字符串/字符获取长度、查找、插入、删除、替换、拷贝、连接。3.使用strFree(CString*)释放字符串占用内存。源码运行效果原文:http://blog.csdn.net/linchaolong/article/details/43944717
1 #include <iostream>2 template<class Type>3class Stack4{5public:6 Stack(int MaxStackSize=100);7bool IsFull();8bool IsEmpty();9void StackFull();
10void StackEmpty();
11void Push(const Type& x);
12 Type Pop(Type& x);
13private:
14int top;
15 Type * stack;
16int MaxSize;
17};
18 template<class Type>
19 Stack<Type>::Stack(int MaxStackSize):MaxSize(MaxStackSize)//构造函数 20{
2...
1.程序框架分析:a)首先将mutex, condition, queue 封装成各自的类,方便对外提供接口函数,这里要注意 condition的封装,一个条件变量和一把锁是一起用的,因此在初始化 condition 对象的时候要用一个 mutex 对象去初始化,在pthread_cond_wait函数中还要用到互斥锁中的指针,因此在mutex 类中要封装一个返回相应类型的函数。此外多个条件变量一般是和同一互斥锁进行交互,因此要在condition 中的 mutex对象设为引用,这里可以...
设计与声明所谓软件设计,是“令软件做出你希望它做的事情”的步骤和方法,通常以颇为一般性的构想开始,最终十足的细节,以允许特殊接口(interface)的开发。这些接口而后必须转换为C++声明式。本文讨论对良好C++接口的设计和声明。1. 让接口容易被正确使用,不易被误用C++拥有许多的接口,function接口,class接口,template接口….每一种接口实施客户与你的代码互动的手段。理想情况下,客户总是会准确的使用你的接口并获得理想...
众所周知,C++面向对象的三大特性为:封装,继承和多态。下面我们就先对封装做一些简单的了解。封装是通过C++中的类来完成的,类是一种将抽象转换为用户定义类型的工具。类的定义如下:class circle
{public: //成员变量int m_L;int m_H;public: //成员函数(方法)double get_Square(){return m_L*m_H;}
}
在上面的代码中,我们定义了一个 "circle" 类,主要包含三个部分:成员变量,成员方法和访问控制(public, protect, priv...
目前 mysql 官方的 c++ connector 还没有针对vs2017编译的二进制包,在mysql官方网站上下载的release二进制包在vs2017下可以用,但是下载的debug包在vs2017下运行时却提示找不到vcruntime140_1D.dll 而下载c++ connector源码进行编译,它还要依赖boost,而且编译过程中还出现一些找不到sys/types.h头文件的之类错误,搞的我整个人都不好了。干脆在mysql的c api基础上自己写了一个。 特点:header only,基于C++17,依赖fmt库(fmt库也...
1#ifndef PROCESS_LOG_H2#define PROCESS_LOG_H3 4 #include <string>5 #include <sstream>6 #include <cstring>7 8 #include <fcntl.h>9 #include <sys/stat.h>
10 #include <sys/types.h>
11 #include<sys/time.h>
12 #include<unistd.h>
1314using std::string;
1516#define LOG_KIND_FILE_NAME 1
17#define LOG_KIND_FIFO_NAME 2
1819#define LOG_ERROR_OPEN_FILE 1
20#define LOG_ERROR_MKFIFO 2
21#define LOG_ERROR_OPEN_FI...
引自:https://blog.csdn.net/man_sion/article/details/77196766//模板类作为友元时要先有声明template <typename T> class SmartPtr;//辅助类template <typename T> class RefPtr{private: //该类成员访问权限全部为private,因为不想让用户直接使用该类 friend class SmartPtr<T>; //定义智能指针类为友元,因为智能指针类需要直接操纵辅助类 //构造函数的参数为基础对象的指针 RefPtr(T *ptr):p(ptr), count(...
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++开发的人都转向用更强大的VS.Net。在这种情况 下,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使 用。
比如,现在有一个工程名为NativeCppDll的由C++编写的DLL,里面输出了一个CPerson类。下面是具体的代码:
// NativeCppDll.h#pragma once#ifndef LX_DL...
第三课 MFC窗口创建过程以及窗口类的封装MFC的每一个类都是以C开头的,表明这是一个Class。工程包含(单文档)创建工程名为aaa的工程(单文档)时,在类视图中可看见五个类:CAboutDlg
CMainFrame
CAaaApp
CAaaDoc
CAaaView其中:类CAboutDlg继承自CDialog类,对话框的类类CMainFrame继承自CFrameWnd类,创建整个程序的框架窗口类CAaaApp继承自CWinApp类,创建唯一的应用程序对象类CAaaDoc继承自CDocument类,数据的存储加载由Doc来...
CLI封装Union时,没有对应的类型,使用的是结构体struct,指定每个元素的偏移位置。【1】声明结构体struct时,需要显示指定为Explicit。【2】每个数据需要使用FieldOffsetAttribute指定偏移位置。C++导出函数typedef union _testStru4
{int iValLower;int iValUpper;struct {__int64 llLocation;};
}testStru4;//4.4 union类型中含有结构体
EXPORTDLL_CLASS void Struct_Union( testStru4 *pStru )
{if (NULL == pStru){return;}...
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++开发的人都转向用更强大的VS.Net。在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用。 比如,现在有一个工程名为NativeCppDll的由C++编写的DLL,里面输出了一个CPerson类。下面是具体的代码:// NativeCppDll.h
#pragma once
#ifndef LX_DLL...
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !
在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数。static定义的类的成员函数就是一个全局函数。
...