如何保证临界区的程序被执行?

各位前辈,小弟刚刚入门并发编程,遇到了这样一个问题,代码如下:


void * thread_main(void *arg)
{
    while (true)
    {
        lock();

        //执行代码

        unlock();
    }
}

在并发编程中是否存在这样一种情况(理论上):

比如说while(true)循环进入后就是临界区,而且临界区内代码比较复杂,执行时间长,这样当前线程可能在时间片用完时,正位于临界区中,另一个线程如果要进入临界区,此时处于阻塞状态,操作系统无法给另一个线程分配时间片,所以操作系统继续执行当前线程,下一次时间片用完时极大可能还是在临界区中,这样的话另一个线程始终得不到时间片。

是否存在这种问题呢,望各位前辈指教。