add LockPtr test with a Mutex and Thread class. Now it is possible to do some simple cross platform multithreading withhin Loki

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@491 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
syntheticpp 2006-01-17 11:18:38 +00:00
parent 00bb8d6ba8
commit 8840afc7dd
5 changed files with 592 additions and 0 deletions

339
test/LockingPtr/LockingPtr.vcproj Executable file
View file

@ -0,0 +1,339 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8,00"
Name="LockingPtr"
ProjectGUID="{0DCBE03A-DAC7-4669-B29B-102D8F563736}"
RootNamespace="LockingPtr"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="-wd4996"
Optimization="0"
AdditionalIncludeDirectories="..\..\include;c:\sandbox\boost"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE _SECURE_SCL=1"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="loki.lib"
AdditionalLibraryDirectories="..\..\lib"
GenerateDebugInformation="true"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
AdditionalIncludeDirectories="..\..\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCWebDeploymentTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\include\loki\AbstractPimpl.h"
>
</File>
<File
RelativePath="..\..\include\loki\AssocVector.h"
>
</File>
<File
RelativePath="..\..\include\loki\DataGenerators.h"
>
</File>
<File
RelativePath="..\..\include\loki\EmptyType.h"
>
</File>
<File
RelativePath="..\..\include\loki\Factory.h"
>
</File>
<File
RelativePath="..\..\include\loki\Function.h"
>
</File>
<File
RelativePath="..\..\include\loki\Functor.h"
>
</File>
<File
RelativePath="..\..\include\loki\HierarchyGenerators.h"
>
</File>
<File
RelativePath="..\..\include\loki\LockingPtr.h"
>
</File>
<File
RelativePath="..\..\include\loki\LokiTypeInfo.h"
>
</File>
<File
RelativePath="..\..\include\loki\MultiMethods.h"
>
</File>
<File
RelativePath="..\..\include\loki\NullType.h"
>
</File>
<File
RelativePath="..\..\include\loki\Pimpl.h"
>
</File>
<File
RelativePath="..\..\include\loki\SafeFormat.h"
>
</File>
<File
RelativePath="..\..\include\loki\ScopeGuard.h"
>
</File>
<File
RelativePath="..\..\include\loki\Sequence.h"
>
</File>
<File
RelativePath="..\..\include\loki\Singleton.h"
>
</File>
<File
RelativePath="..\..\include\loki\SmallObj.h"
>
</File>
<File
RelativePath="..\..\include\loki\SmartPtr.h"
>
</File>
<File
RelativePath="..\..\include\loki\static_check.h"
>
</File>
<File
RelativePath="..\..\include\loki\Threads.h"
>
</File>
<File
RelativePath="..\..\include\loki\Tuple.h"
>
</File>
<File
RelativePath="..\..\include\loki\Typelist.h"
>
</File>
<File
RelativePath="..\..\include\loki\TypelistMacros.h"
>
</File>
<File
RelativePath="..\..\include\loki\TypeManip.h"
>
</File>
<File
RelativePath="..\..\include\loki\TypeTraits.h"
>
</File>
<File
RelativePath="..\..\include\loki\Visitor.h"
>
</File>
<Filter
Name="flexstring"
>
<File
RelativePath="..\..\include\loki\flex\allocatorstringstorage.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\cowstringopt.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\flex_string.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\flex_string_details.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\flex_string_shell.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\simplestringstorage.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\smallstringopt.h"
>
</File>
<File
RelativePath="..\..\include\loki\flex\vectorstringstorage.h"
>
</File>
</Filter>
</Filter>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.cpp"
>
</File>
<File
RelativePath=".\Thread.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

11
test/LockingPtr/Makefile Executable file
View file

@ -0,0 +1,11 @@
BIN = main
CC = gcc
CXXFLAGS = -Wall -O2
CPPFLAGS = -I../../include -DNDEBUG
LDFLAGS = -L../../lib
LDLIBS = -lloki
.PHONY: build clean
build: $(BIN)
clean:
rm -f $(BIN) $(BIN).exe $(BIN).o

126
test/LockingPtr/Thread.h Executable file
View file

@ -0,0 +1,126 @@
////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2006 Peter Kümmel
// Permission to use, copy, modify, distribute and sell this software for any
// purpose is hereby granted without fee, provided that the above copyright
// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
// The author makes no representations about the
// suitability of this software for any purpose. It is provided "as is"
// without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
#ifndef LOKI_THREAD_H_
#define LOKI_THREAD_H_
#include <loki/Threads.h>
#include <vector>
#if defined(_WIN32)
#include <process.h>
typedef unsigned int (WINAPI*ThreadFunction_)(void *);
#define LOKI_pthread_t HANDLE
#define LOKI_pthread_create(handle,attr,func,arg) \
(int)((*handle=(HANDLE) _beginthreadex (NULL,0,(ThreadFunction_)func,arg,0,NULL))==NULL)
#define LOKI_pthread_join(thread, result) \
((WaitForSingleObject((thread),INFINITE)!=WAIT_OBJECT_0) || !CloseHandle(thread))
#else
#define LOKI_pthread_t \
pthread_t
#define LOKI_pthread_create(handle,attr,func,arg) \
pthread_create(handle,attr,func,arg)
#define LOKI_pthread_join(thread, result) \
pthread_join(thread, result)
#endif
namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// \class Thread
//
// \ingroup ThreadingGroup
// Very simple Thread class
////////////////////////////////////////////////////////////////////////////////
class Thread
{
public:
typedef void* (*ThreadFunction)(void *);
Thread(ThreadFunction func, void* parm)
{
func_ = func;
parm_ = parm;
}
int start()
{
return LOKI_pthread_create(&pthread_, NULL, func_, parm_);
}
static int WaitForThread(const Thread& thread)
{
int status = 0;
(void) status;
return LOKI_pthread_join(thread.pthread_, (void **)&status);
}
static void JoinThreads(const std::vector<Thread*>& threads)
{
int status = 0;
(void) status;
for(size_t i=0; i<threads.size(); i++)
WaitForThread(*threads.at(i));
}
static void DeleteThreads(std::vector<Thread*>& threads)
{
for(size_t i=0; i<threads.size(); i++)
{
delete threads.at(i);
}
threads.clear();
}
private:
LOKI_pthread_t pthread_;
ThreadFunction func_;
void* parm_;
};
////////////////////////////////////////////////////////////////////////////////
// \class Mutex
//
// \ingroup ThreadingGroup
// A portable Mutex
////////////////////////////////////////////////////////////////////////////////
class Mutex
{
public:
Mutex() { LOKI_THREADS_MUTEX_INIT (&mtx_);}
~Mutex() { LOKI_THREADS_MUTEX_DELETE(&mtx_);}
void Lock() { LOKI_THREADS_MUTEX_LOCK (&mtx_);}
void Unlock(){ LOKI_THREADS_MUTEX_UNLOCK(&mtx_);}
private:
LOKI_THREADS_MUTEX mtx_;
};
} // namespace Loki
#endif
// $Log:

110
test/LockingPtr/main.cpp Executable file
View file

@ -0,0 +1,110 @@
////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2006 Peter Kümmel
// Permission to use, copy, modify, distribute and sell this software for any
// purpose is hereby granted without fee, provided that the above copyright
// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
// The author makes no representations about the
// suitability of this software for any purpose. It is provided "as is"
// without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
// $Header:
#define LOKI_CLASS_LEVEL_THREADING
#include "Thread.h"
#include <loki/LockingPtr.h>
#include <loki/SafeFormat.h>
using namespace Loki;
int g;
int numThreads = 10;
int loop = 5;
struct A
{
#define DO for(int i=0; i<10000000; i++) g++;
void print(void* id)
{
DO;Printf("%p: ----------------\n")(id);
DO;Printf("%p: ---------------\n")(id);
DO;Printf("%p: --------------\n")(id);
DO;Printf("%p: -------------\n")(id);
DO;Printf("%p: ------------\n")(id);
DO;Printf("%p: -----------\n")(id);
DO;Printf("%p: ----------\n")(id);
DO;Printf("%p: ---------\n")(id);
DO;Printf("%p: --------\n")(id);
DO;Printf("%p: -------\n")(id);
DO;Printf("%p: ------\n")(id);
DO;Printf("%p: -----\n")(id);
DO;Printf("%p: ----\n")(id);
DO;Printf("%p: ---\n")(id);
DO;Printf("%p: --\n")(id);
DO;Printf("%p: -\n")(id);
DO;Printf("%p: \n")(id);
DO;Printf("%p: \n")(id);
}
};
typedef Loki::LockingPtr<A,Loki::Mutex> LPtr;
void* RunLocked(void *id)
{
A a;
static Loki::Mutex m;
for(int i=0; i<loop; i++)
{
LPtr l(a,m);
l->print(id);
}
return 0;
}
void* Run(void *id)
{
A a;
for(int i=0; i<loop; i++)
a.print(id);
return 0;
}
int main ()
{
std::vector<Thread*> threads;
for(int i=0; i<numThreads; i++)
{
Printf("Creating thread %d\n")(i);
threads.push_back(new Thread(RunLocked,(void*)i));
}
for(int i=0; i<numThreads; i++)
threads.at(i)->start();
Thread::JoinThreads(threads);
Thread::DeleteThreads(threads);
Printf("--------------------------------------------------------------------------------------\n");
Printf("--------------------------------------------------------------------------------------\n");
Printf("--------------------------------------------------------------------------------------\n");
for(int i=0; i<numThreads; i++)
{
Printf("Creating thread %d\n")(i);
threads.push_back(new Thread(Run,(void*)i));
}
for(int i=0; i<numThreads; i++)
threads.at(i)->start();
Thread::JoinThreads(threads);
Thread::DeleteThreads(threads);
}

6
test/LockingPtr/make.msvc.bat Executable file
View file

@ -0,0 +1,6 @@
cl -c -Zm200 -O2 -DNDEBUG -MT -EHsc -GR -W0 -wd4710 -I"." -I"..\..\include" main.cpp
link /NOLOGO /SUBSYSTEM:CONSOLE /incremental:no /OUT:"main-msvc.exe" ..\..\lib\loki.lib main.obj
del *.obj