SDL 线程 锁 信号量

我们开发android的时候知道,主线程不能执行耗时的操作,否者的话就会导致ANR错误。

SDL的开发也同样不能在主线程执行耗时操作,或者就会导致播放器接收不到我们的输入操作。

 

SDL创建线程的函数如下:

SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data);

fn 要执行的函数

name 线程的名字

data 执行函数的参数 可以是任何类型的指针。

 

线程的互斥与同步

互斥:资源某一时刻只能有一个线程访问(锁)

同步:一个线程完成了,通过信号通知第二线程再开始执行。就像流水线一样。(信号)

锁的种类:

互斥锁。

读写锁。

自旋锁。

可重入锁:对当前线程可以重复进入,其他线程不能进入。

 

互斥锁和读写锁的区别。

互斥锁:等待时,让出CPU,等待其他线程释放互斥锁,通过信号唤醒当前线程。

自旋锁:等待时,不让出CPU,循坏检查当前锁是否被释放,释放后当前线程执行。

通过对比,我们知道自旋锁加锁旗舰,执行线程不能耗时太长。

 

SDL 只提供了互斥锁

extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void);

extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex);

 

上锁与释放锁

extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex);

extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex);

 

信号量:

extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void);

extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond);

extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex);

 

#include <stdio.h>

#include <SDL2/SDL.h>

static SDL_mutex *m_mutex;
static SDL_cond *m_cond;
static int first_end = 0;
static int second_end = 0;

int first_func_print()
{
    SDL_LockMutex(m_mutex);
    for (int i = 0; i < 5; i++)
    {
        printf("first_func_print %d\n", i);
    }
    SDL_CondSignal(m_cond);
    SDL_CondWait(m_cond, m_mutex);
    for (int i = 5; i < 10; i++)
    {
        printf("first_func_print %d\n", i);
    }
    first_end = 1;
    SDL_UnlockMutex(m_mutex);
    return 1;
}

int second_func_print()
{
    SDL_LockMutex(m_mutex);
    for (int i = 0; i < 5; i++)
    {
        printf("second_func_print %d\n", i);
    }
    SDL_CondSignal(m_cond);
    second_end = 1;
    SDL_UnlockMutex(m_mutex);
    return 1;
}

int main(int argc, char *argv[])
{
    m_mutex = SDL_CreateMutex();
    m_cond = SDL_CreateCond();
    SDL_CreateThread(first_func_print, "first_func_print", NULL);
    SDL_CreateThread(second_func_print, "second_func_print", NULL);
    while(!first_end || !second_end){
        
    }
    printf("print end \n");
    SDL_DestroyCond(m_cond);
    SDL_DestroyMutex(m_mutex);
    SDL_Quit();
}

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来解答一下你的问题。 首先,你需要了解SDL2的基本概念和使用方法。SDL2是一个跨平台的多媒体库,可以用来创建窗口、渲染图像、播放音频等等。在SDL2中,你可以使用线程来实现多任务处理,从而提高程序的效率。下面是一个简单的使用SDL2创建窗口并渲染图像的例子: ```c++ #include <SDL2/SDL.h> int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("My Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_Surface* surface = SDL_LoadBMP("myimage.bmp"); SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); SDL_Rect dstrect = { 0, 0, 640, 480 }; SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, &dstrect); SDL_RenderPresent(renderer); SDL_Delay(3000); SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 上面的代码创建了一个窗口并在窗口中渲染了一张图片。现在,我们来看看如何将两个画面分图层分线程分别绘制。 首先,你需要创建两个线程,每个线程负责渲染一个画面。你可以在每个线程中调用SDL2的渲染函数来绘制图像。例如,你可以在一个线程中渲染背景,另一个线程中渲染前景。 ```c++ #include <SDL2/SDL.h> #include <thread> void renderBackground(SDL_Renderer* renderer) { SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); SDL_RenderClear(renderer); } void renderForeground(SDL_Renderer* renderer) { SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_Rect dstrect = { 0, 0, 320, 240 }; SDL_RenderFillRect(renderer, &dstrect); } int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("My Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN); SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); std::thread backgroundThread(renderBackground, renderer); std::thread foregroundThread(renderForeground, renderer); backgroundThread.join(); foregroundThread.join(); SDL_RenderPresent(renderer); SDL_Delay(3000); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` 上面的代码创建了两个线程,一个线程负责渲染背景,另一个线程负责渲染前景。这两个线程都使用了相同的渲染器来绘制图像。在主线程中,我们等待这两个线程执行完毕后再调用SDL_RenderPresent函数将图像显示在屏幕上。 希望这个例子可以帮助你理解如何使用SDL2来让两个画面分图层分线程分别绘制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值