pthread for win32

まずは header "pthread.h"

/* pthread.h */

#ifndef PTHREAD_H_INCLUDED
#define PTHREAD_H_INCLUDED

#ifdef WIN32
#include <windows.h>
#include <process.h>

typedef struct
{
	void*(*startfunc)(void*);
	void* arg;
	HANDLE handle;
	void* retval;
} pthread_t;

typedef struct
{
	int starttype;
} pthread_attr_t;

static unsigned __stdcall win32_threadStart(void*);

int pthread_create(pthread_t* thread, pthread_attr_t* attr,
	void*(start_routine)(void*), void* arg);
int pthread_join(pthread_t th, void** thread_return);

#endif /* WIN32 */

#endif /* PTHREAD_H_INCLUDED */

で、本体 "pthread.c"

/* pthread.c */

#include "pthread.h"

static unsigned __stdcall win32_threadStart(void* arg)
{
	pthread_t* pt = (pthread_t*)arg;
	pt->retval = pt->startfunc(pt->arg);
	return 0;
}

int
pthread_create(pthread_t* thread, pthread_attr_t* attr,
	void*(*start_routine)(void*), void* arg)
{
	thread->startfunc = start_routine;
	thread->arg = arg;
	thread->retval = 0;
	thread->handle = (HANDLE)_beginthreadex(0, 0, win32_threadStart, thread, 0, 0);
	return 0;
}

int
pthread_join(pthread_t th, void** thread_return)
{
	if(WaitForSingleObject(th.handle, INFINITE) == WAIT_OBJECT_0)
	{
		if(thread_return != 0)
			*thread_return = th.retval;
		return 0;
	}
	return (-1);
}

で、object module を作るには

gcc -DWIN32 -c pthread.c

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-27 (金) 10:36:45