⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mythread_linux.c

📁 sourceforge历史版本完整下载: http://sourceforge.net/project/showfiles.php?group_id=202044 提供了基于b树索引算法的文件数据数据
💻 C
字号:
/*
*
*mythread_win32.c 封装线程接口 lin shao chuan
*
*/
#include "mythread.h"

#include <assert.h>
#include <pthread.h>
#include <semaphore.h>

#include "mylog.h"


typedef struct __mythread_t_
{
	//本对象内存池标识
	HMYMEMPOOL hm;

	//起始地址与用户参数
	MY_THREAD_FUN fun;
	void * userdata;

	//线程id与句柄
	pthread_t thr;
	int run;

	//是否挂起创建
	int bsuspend;
	sem_t s;

	/* 通知构造返回的信号量 */
	sem_t s_ret;
}mythread_t;


/**
 * @brief 线程退出处理
 */
static void  thread_exit(void * param)
{
	mythread_t * mt = (mythread_t *)param;
	assert(mt);
	
	LOG_DEBUG(("thread_exit %x, %d", mt, mt->thr));

	if(mt->bsuspend)
		sem_destroy(&mt->s);

	sem_destroy(&mt->s_ret);
	MyMemPoolFree(mt->hm, mt);
}

static void * threadfun(void * data)
{
	mythread_t * mt = (mythread_t *)data;
	assert(mt && mt->fun);

	mt->thr = pthread_self();
	LOG_INFO(("new thread %d %d %x", pthread_self(), mt->thr, mt));
	sem_post(&mt->s_ret);

	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

	//压入释放操作,不允许cancel线程
	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);	
	pthread_cleanup_push(thread_exit, mt);	
	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

	if(mt->bsuspend)
	{
		LOG_INFO(("suspend %d", pthread_self()));
		sem_wait(&mt->s);
	}

	mt->run = 1;

	mt->fun(mt->userdata);

	pthread_cleanup_pop(1);

	return NULL;
}


/*
*
*创建线程
*
*/
HMYTHREAD MyThreadConstruct(MY_THREAD_FUN fun, void * data, int bsuspend, HMYMEMPOOL hm)
{
	int ret = 0;
	mythread_t * mt = (mythread_t *)MyMemPoolMalloc(hm, sizeof(*mt));
	if(NULL == mt)
		return NULL;

	assert(fun);

	mt->fun = fun;
	mt->userdata = data;
	mt->hm = hm;
	mt->run = 0;
	mt->thr = 0;
	mt->bsuspend = bsuspend;

	if(bsuspend)
		sem_init(&mt->s, 0, 0);
	
	sem_init(&mt->s_ret, 0, 0);

	//是否挂起创建
	if(0 != pthread_create(&mt->thr, NULL, threadfun, mt))
	{
		LOG_WARN(("pthread_create fail"));
		
		if(mt->bsuspend)
			sem_destroy(&mt->s);
		
		sem_destroy(&mt->s_ret);
		MyMemPoolFree(mt->hm, mt);
		return NULL;
	}

	sem_wait(&mt->s_ret);

	LOG_DEBUG(("MyThreadConstruct:%d, %x", mt->thr, mt));

	return (HMYTHREAD)mt;
}

/*
*
*销毁线程
*
*/
void MyThreadDestruct(HMYTHREAD ht)
{
	mythread_t * mt = (mythread_t *)ht;
	if(NULL == mt)
		return;

	LOG_DEBUG(("MyThreadDestruct:%d %x", mt->thr, mt));

	if(mt->thr)
		pthread_cancel(mt->thr);
}

/*
*
*运行线程
*
*/
void MyThreadRun(HMYTHREAD ht)
{
	mythread_t * mt = (mythread_t *)ht;	
	if(NULL == mt)
		return;

	if(mt->run)
		return;

	sem_post(&mt->s);
}

/*
*
*停止线程运行
*
*/
void MyThreadSuspend(HMYTHREAD ht)
{
	LOG_INFO(("no support"));
}

/*
*
*等待线程退出
*
*/
void MyThreadJoin(HMYTHREAD ht)
{
	mythread_t * mt = (mythread_t *)ht;
	if(NULL == mt)
		return;

	LOG_DEBUG(("MyThreadJoin:%d", mt->thr));
	pthread_join(mt->thr, NULL);
}

/*
*
* 判断呼叫此函数的线程是否就是ht本身
* 1:表示是, 0:表示否
*
*/
int MyThreadInMyContext(HMYTHREAD ht)
{
	pthread_t temp;
	mythread_t * mt = (mythread_t *)ht;
	if(NULL == mt)
		return 0;

	temp = pthread_self();

	LOG_DEBUG(("MyThreadInMyContext:%d - %d %x", temp, mt->thr, mt));
	return ((temp == mt->thr) ? 1 : 0);
}










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -