oracle12c 为啥会卡在创建并启动oracle实例?进度88%。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle12c 为啥会卡在创建并启动oracle实例?进度88%。相关的知识,希望对你有一定的参考价值。
卡主就不动了,少说也有1个多小时了(压缩包of2的文件已经是复制到of1里面的)。求有解决经验的大神帮帮忙。
参考技术A oracle 12C在安装时让创建启动数据库的意思是在安装oracle软件过程中由安装程序为你创建一个数据库实例。具体解释如下:
1、如果选择此选项,则安装程序会为你安装一个数据库实例,并将此实例运行,即OPEN状态,你可以在系统运行的本地服务中查看到此服务。
2、如果不选择此选项,则安装程序会为你安装一个数据库实例,则安装程序只为你安装oracle软件。你可以在oracle程序的菜单中,配置和迁移工具部分,选择database configuration assistant进行手动安装自己的数据库实例。
延迟线程启动 - 通知所有未唤醒所有线程
【中文标题】延迟线程启动 - 通知所有未唤醒所有线程【英文标题】:Delayed Thread Start - Notify All Not Waking All Threads 【发布时间】:2018-06-13 16:27:17 【问题描述】:尝试:
在多个线程上执行延迟启动。
问题:
我创建了下面的示例来证明这个想法,并尝试在 x 上创建一个竞赛代码来证明所有线程都可以同时运行。
似乎事情是串行化的,而不是并行运行的——这是所需的行为,但可能每个线程运行的时间太短,并且在其他线程得到服务之前完成
有时一个线程会卡在 cv.wait 上 --- 我在 GDB 中查看过,可以看到其中一个线程在第 0 帧等待等待 --- 这意味着 notify_all 没有唤醒所有线程 ---(这是零星的行为,每隔几次尝试运行二进制文件就会发生)
询问:
使用条件变量是否是执行延迟启动一组线程的有效方法,这些线程的期望行为将全部并行运行?
为什么 notify_all() 没有唤醒所有线程?
代码:
// main.cpp
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <atomic>
#include <iostream>
#include <unistd.h>
int main()
std::condition_variable cv;
std::mutex cv_m;
int x = 0;
std::thread t1 = std::thread([&]std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk); std::cout << "t1 x:" << x++ << std::endl;);
std::thread t2 = std::thread([&]std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk); std::cout << "t2 x:" << x++ << std::endl;);
std::thread t3 = std::thread([&]std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk); std::cout << "t3 x:" << x++ << std::endl;);
std::thread t4 = std::thread([&]std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk); std::cout << "t4 x:" << x++ << std::endl;);
std::thread t5 = std::thread([&]std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk); std::cout << "t5 x:" << x++ << std::endl;);
std::cout << "STARTING" << std::endl;
cv.notify_all();
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
std::cout << "DONE" << std::endl;
return 0;
编译:
g++ -std=c++14 main.cpp -lpthread
正在运行:
./a.out
【问题讨论】:
【参考方案1】:条件变量是无状态的。如果没有服务员,通知会丢失;可以传递spurios 通知。您需要等待共享状态的变化,而不是来自条件变量的信号。
std::condition_variable:
当通知条件变量、超时过期或发生虚假唤醒时,线程被唤醒,互斥量被原子地重新获取。如果唤醒是虚假的,线程应该检查条件并继续等待。
此外,当通知条件变量时,如果需要保留服务员 FIFO 顺序,则必须保留互斥锁。
修复:
int main()
std::condition_variable cv;
std::mutex cv_m;
int x = 0;
bool start = false;
auto thread_fn = [&]
std::unique_lock<std::mutex> lk(cv_m);
while(!start)
cv.wait(lk);
std::cout << "t1 x:" << x++ << std::endl;
;
std::thread t1 = std::thread(thread_fn);
std::thread t2 = std::thread(thread_fn);
std::thread t3 = std::thread(thread_fn);
std::thread t4 = std::thread(thread_fn);
std::thread t5 = std::thread(thread_fn);
std::cout << "STARTING" << std::endl;
std::unique_lock<std::mutex> lock(cv_m);
start = true;
cv.notify_all();
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
std::cout << "DONE" << std::endl;
【讨论】:
感谢您的精彩解释和精心编写的修复。非常感谢。以上是关于oracle12c 为啥会卡在创建并启动oracle实例?进度88%。的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 12c orcl不能直接创建用户了,开机不自动启动PDB,这些怎么办