摘要:
线程同步是多线程程序设计的核心 内容,它的目的是正确处理多线程并发时的各种问题,例如线程的等待、多个线程访问同一数据时的互斥,防死锁等。Win32提供多种内核对象和手段用于线程 同步,如互斥量、信号量、事件、临界区等。所不同的是,互斥量、信号量、事件都是Windows的内核对象,当程序对这些对象进行控制时会自动转换到核心 态,而临界区本身不是内核对象,它是工作在用户态的。我们知道从用户态转换到核心态是需要以时间为代价的,所以如果能在用户态就简单解决的问题,就可以不 必劳烦核心态了。 这里我要说的是两种用于C++的多线程同步类,通过对这两种类的使用就可以方便的实现对变量或代码段的加锁控制,从而. 阅读全文
摘要:
//////获取系统信息Demo///#include "stdafx.h"#include<windows.h>#include<conio.h>#include<tchar.h>#include<locale.h>#include"Reader.h"#include"Writer.h"#include<stdlib.h>#include<iostream>using namespace std;wchar_t* envVarStrings[]={ TEXT(& 阅读全文
摘要:
// Writer.cpp#include"stdafx.h"#include <windows.h>#include <conio.h>#define BUF_SIZE 256wchar_t szName[30]=TEXT("Global\\MyFileMappingObject");wchar_t szMsg[30]=TEXT("Message from first process.");wchar_t chr[100]; int _tmain(){ HANDLE hMapFile; LPCTSTR pBu 阅读全文
摘要:
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 HANDLE handle; 4 wchar_t szFile[64] = L"kingdom_0,你好"; 5 unsigned long lWritten, lRead; 6 handle=CreateFile(L"D:\\Example.txt", FILE_ALL_ACCESS, FILE_SHARE_READ|FILE_SHARE_WRITE, 7 NULL, OPEN_ALWAYS... 阅读全文
摘要:
堆和栈的区别(转贴)非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥!堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一 阅读全文
摘要:
private string ConvertDataTableToXML(DataTable xmlDS) { MemoryStream stream = null; XmlTextWriter writer = null; try { stream = new MemoryStream(); writer = new XmlTextWriter(stream, Encoding.UTF8); xmlDS... 阅读全文
摘要:
1.函数指针double pam(int);double (*pf) (int);pf=pam;double x=pam(6);double y=(*pf)(6);//通过double yy=pf(5);//通过历史和逻辑:为何pf和(*pf)等价呢?一种学派认为,由于pf是函数指针,而*pf是函数,因此应将(*pf)()用过函数调用。另一种学派认为,由于函数名是指向该函数的指针,指向函数的指针的行为应与函数名相似,因此应将pf()用作函数调用使用。C++进行了折衷--这两种方式都是正确的,或者至少是允许的,虽然他们在逻辑上是相互冲突的。在认为折衷折衷粗糙之前,应该想到,容忍逻辑上无法自圆其说 阅读全文
摘要:
public delegate void ConnectEventHandler();//定义连接委托 public delegate void SendEventHandler();//定义发送委托 public delegate void PackageEventHandler();//定义收到一个完整的数据包委托 public class SocketHelper { private Socket socket;//定义Socket private SocketAsyncEventArgs socketArgs;//定义Socket参数 public event ConnectEvent 阅读全文
摘要:
1.使用new和delete时,应遵守以下规则:* 不要是用delete来释放不是new分配的内存。* 不要是用delete释放同一个内存块两次。* 如果是用new[]为数组分配内存,则应使用delete来释放。* 如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放。* 对空值指针应用delete是安全的。2.一般来说,如果给count提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果要限制的是字符串的地址,则必须将这种指针强制转换为另一种指针类型,如int *。char *animal="dog";c 阅读全文
摘要:
1.重写库函数:在main方法之前先声明,例如: double sqrt(double);在main方法之后,给出新的sqrt方法的实现,例如:double sqrt(double d){ return 2.5;}2.一些说明main不是关键字,由于它不是语言的组成部分,不过,他是一个必不可少的函数的名称。可以用作变量名(在一些很神秘的以至于无法再这里介绍的情况中,将main用作变量名会引发错误,由于它在这种情况下都是容易混淆的,因此最好不要这样做).同样,其他函数名和变量名也都不能是关键字。不过,在程序中将同一个名称(比如cout)用作对象名会把编译器搞糊涂。也就是说,在不适用cout对象. 阅读全文