NDK编程之SDL(2.0)线程练习

函数API http://www.ginkgobitter.org/sdl/?SDL_TLSSet

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include "SDL.h"
#include "SDL_thread.h"

static SDL_TLSID tls;
static int alive = 0;

/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void quit(int rc)
{
	SDL_Quit();
	exit(rc);
}

int SDLCALL ThreadFunc(void *data)
{
	SDL_TLSSet(tls, "baby thread", NULL);
	SDL_Log("Started thread %s: My thread id is %lu, thread data = %s\n", //
			(char *) data, SDL_ThreadID(), (const char *) SDL_TLSGet(tls));
	while (alive)
	{
		SDL_Log("Thread '%s' is alive!\n", (char *) data);
		SDL_Delay(1 * 1000);
	}
	SDL_Log("Thread '%s' exiting!\n", (char *) data);
	return (0);
}

static void killed(int sig)
{
	SDL_Log("Killed with SIGTERM, waiting 5 seconds to exit\n");
	SDL_Delay(5 * 1000);
	alive = 0;
	quit(0);
}

int main(int argc, char *argv[])
{
	SDL_Thread *thread;

	/* Enable standard application logging */
	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);

	/* Load the SDL library */
	if (SDL_Init(0) < 0)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
		return (1);
	}

	/**
	 * 创建一个所有线程都可见的标示符,但是可以为每个线程设置专有的数据
	 */
	tls = SDL_TLSCreate();
	SDL_assert(tls);
	SDL_TLSSet(tls, "main thread", NULL);
	SDL_Log("Main thread data initially: %s\n", (const char *) SDL_TLSGet(tls));

	/**
	 * 创建线程1
	 */
	alive = 1;
	thread = SDL_CreateThread(ThreadFunc, "One", "#1");
	if (thread == NULL)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
		quit(1);
	}
	SDL_Delay(5 * 1000);
	SDL_Log("Waiting for thread #1\n");
	alive = 0;// 线程1结束
	SDL_WaitThread(thread, NULL);// 等待一个线程结束

	/**	创建线程2	*/
	SDL_Log("Main thread data finally: %s\n", (const char *) SDL_TLSGet(tls));
	alive = 1;
	signal(SIGTERM, killed);
	thread = SDL_CreateThread(ThreadFunc, "Two", "#2");
	if (thread == NULL)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create thread: %s\n", SDL_GetError());
		quit(1);
	}
	raise(SIGTERM);// 线程2结束

	SDL_Quit(); /* Never reached */
	return (0); /* Never reached */
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值