SDL 线程创建(SDL_LockMutex / SDL_UnlockMutex、SDL_CondWait / SDL_CondSignal)

发布时间 2023-08-17 11:57:18作者: 封兴旺

 

SDL_mutex* s_lock = NULL;
SDL_cond* s_cond = NULL;

int thread_work(void* arg)
{
	SDL_LockMutex(s_lock);

	printf("[thread_work] in .\n");

	Sleep(5000);

	printf("[thread_work] 好了,知道了,我刚刚去玩了5秒,我直接 SDL_CondWait 把锁给你我自己睡觉去了。你拿到锁之后操作完了,记得1:把锁释放掉(还给我) 2:唤醒我 .\n");

	SDL_CondWait(s_cond, s_lock); // 这里直接就阻塞了,等着被唤醒

	printf("[thread_work] 这么早叫醒我干嘛,好了,我去其它地方玩去了 !  .\n");

	SDL_UnlockMutex(s_lock);

	printf("[thread_work] out .\n");

	return 0;
}

#undef main
int main()
{
	s_lock = SDL_CreateMutex();
	s_cond = SDL_CreateCond();
	SDL_Thread* t = SDL_CreateThread(thread_work, "thread_work", NULL);
	
	for (int i = 0; i < 2; i++)
	{	
		Sleep(1000);
		printf("[main] for里的2次循环 每次间隔2秒 \n");
		
	}

	printf("[main] 老大我的工作做完了,我现在 SDL_LockMutex 就等着拿锁干你交代的第二个工作了,就等你给锁了. \n");
	SDL_LockMutex(s_lock); // 阻塞,直到获取为止,1.等别人 SDL_UnlockMutex 2.等别人 SDL_CondWait (这种方式你到时候记得解锁了还要唤醒别人)

	// 干第二个工作...

	SDL_UnlockMutex(s_lock); // 解锁
	SDL_CondSignal(s_cond); // 发送信号唤醒别人之前,请先把lock接掉。因为别人醒来之后也是之前有锁的状态,你不释放说不过去吧

	printf("[main] O 了 O 了, 我也走了 .... \n");

	SDL_WaitThread(t, NULL);
	SDL_DestroyMutex(s_lock);
	SDL_DestroyCond(s_cond);
	return 0;
}