当前位置: 首页 > news >正文

建站平台上建设的网站可以融资吗wordpress官方主题

建站平台上建设的网站可以融资吗,wordpress官方主题,wordpress 模板 排名,刷关键词排名seo软件目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量#xff1a;sem_init 2、信号量申请#xff08;P操作#xff09;#xff1a;sem_wait 3、信号量的释放#xff08…目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量sem_init 2、信号量申请P操作sem_wait 3、信号量的释放V操作sem_post 4、信号量的销毁sem_destroy 信号量使用代码示例  三、基于环形队列实现的生产者消费者模型 四、完整代码 五、生产者消费者模型两种实现方法的对比  阻塞队列与条件变量的模型 环形队列与信号量的模型 为什么环形队列与信号量需要两个锁 总结 一、POSIX信号量概述 POSIX信号量是POSIX标准Portable Operating System Interface可移植操作系统接口定义的一种进程/线程间同步机制。它提供了一种跨平台的方法来实现进程间的同步和互斥。POSIX信号量可以用于控制对共享资源的访问确保在任何时刻只有一个进程可以访问该资源或者限制对资源的并发访问数量。 信号量的基本概念 信号量定义 信号量是一个计数器用于管理对有限资源的访问。它通过维护一个计数值来表示资源的数量或可用的资源数。 操作 P操作等待/减少操作当一个线程试图获取资源时它会执行P操作也叫sem_wait这会减少信号量的计数。如果计数值已经为零线程会被阻塞直到有资源可用。V操作信号/增加操作当一个线程释放资源时它会执行V操作也叫sem_post这会增加信号量的计数。如果有线程在等待资源这会唤醒其中一个线程。阻塞与唤醒POSIX 信号量通常有一个等待队列。当信号量的值为 0 或者低于某个阈值时进程或线程在请求信号量时会被阻塞并被加入到信号量的等待队列中。信号量操作系统内部会维护这个队列以确保进程可以在信号量的值变为正数时被唤醒。 信号量在临界区的作用 控制访问         在进入临界区之前线程首先会通过执行P操作来申请信号量。这种操作检查信号量的计数如果计数为零线程会被阻塞直到其他线程释放资源。 计数器机制         信号量的计数器表示可用的资源数。当计数器大于零时表示有足够的资源可用当计数器为零时表示资源已满或不可用线程需要等待。 资源预定         线程在进入临界区之前先进行信号量的P操作申请资源。这种机制确保了临界区中的资源不会被过多的线程访问从而避免了竞态条件和资源冲突。 退出临界区         在离开临界区时线程会执行V操作释放资源。这会增加信号量的计数并可能唤醒等待资源的其他线程。 【注意P和V操作必须保证是原子性的这意味着在执行PV操作时不会有其他线程干扰。】 与互斥锁的比较 互斥锁主要用于保护临界区确保同一时刻只有一个线程能访问临界区。互斥锁不管理资源的计数仅用于保证互斥。信号量不仅提供互斥保护还可以管理资源的数量。信号量适用于需要控制多个线程对有限资源访问的场景。 信号量的原理 我们将可能会被多个执行流同时访问的资源叫做临界资源临界资源需要进行保护否则会出现数据不一致等问题。 当我们仅用一个互斥锁对临界资源进行保护时相当于我们将这块临界资源看作一个整体同一时刻只允许一个执行流对这块临界资源进行访问。 但实际我们可以将这块临界资源再分割为多个区域当多个执行流需要访问临界资源时如果这些执行流访问的是临界资源的不同区域那么我们可以让这些执行流同时访问临界资源的不同区域此时不会出现数据不一致等问题。 信号量的优势 信号量信号灯本质是一个计数器是描述临界资源中资源数目的计数器信号量能够更细粒度的对临界资源进行管理。 在基于阻塞队列的生产者消费者模型章节中我们在访问阻塞队列时同一时刻只会有一个线程成功竞争到互斥锁然后进入临界区当中。而只有进入临界区后该执行流才能去判断阻塞队列中有多少剩余空间或剩余数据。因此我们不仅需要对阻塞队列中的数据条件进行循环判断还需要在阻塞队列为空或为满时在条件变量处进行等待。 而使用信号量其实是对临界资源的预定机制。在进入临界区之前每个线程都会先去申请临界区资源。这就使得线程不需要进入临界区就可以预先完成临界资源的分配同时信号量也使线程对临界资源的操作更细致、更高效 通过维护计数器信号量可以准确地反映当前可用的资源数量。这使得线程在请求和释放资源时能有效地控制资源的使用情况避免了资源过度使用或饥饿状态。信号量通过原子操作来管理资源的计数这可以减少竞争条件和锁争用尤其是在高并发的环境中。 总的来说信号量作为对临界资源的预定机制通过精确控制资源的分配和使用可以提高多线程程序的效率和稳定性。 二、信号量的操作 1、初始化信号量sem_init sem_init 是 POSIX 标准中用于初始化信号量的函数。它用于设置一个信号量对象的初始状态包括其初始计数值和属性设置。 函数原型 int sem_init(sem_t *sem, int pshared, unsigned int value);参数说明 sem (sem_t *sem) 这是指向一个 sem_t 类型的信号量对象的指针。这个对象在 sem_init 调用之前需要被分配空间通常是通过静态分配或动态分配内存。 pshared (int pshared) 这个参数决定了信号量的共享范围。如果 pshared 为 0则信号量是线程间共享的即同一个进程内的多个线程可以访问它。如果 pshared 非 0则信号量是进程间共享的多个进程可以访问这个信号量。此时sem 指向的信号量对象必须存储在共享内存区域中例如通过 mmap 分配的共享内存。 value (unsigned int value) 这是信号量的初始值即信号量计数器的初始值。它表示资源的初始数量或可用数量。 返回值 成功返回 0。失败返回 -1并设置 errno 以指示错误类型。常见的错误包括 EINVAL参数无效或 ENOMEM内存不足。 2、信号量申请P操作sem_wait sem_wait 是 POSIX 标准中用于执行信号量的等待操作的函数。它用于请求信号量通常在多线程或多进程环境中用于实现同步和互斥。  函数原型 int sem_wait(sem_t *sem);参数说明 sem (sem_t *sem) 这是指向一个已经初始化的信号量对象的指针。信号量对象必须在调用 sem_wait 之前通过 sem_init 或其他方式初始化。 返回值 成功返回 0。失败返回 -1并设置 errno 以指示错误类型。常见的错误包括 EINTR操作被信号中断或 EINVAL无效的信号量描述符。 功能和行为 等待信号量sem_wait 函数会尝试将信号量的计数器减少 1。这个操作是原子性的即在执行期间不会被中断。 阻塞和挂起 如果信号量的计数器大于 0sem_wait 会将计数器减 1并立即返回允许线程继续执行。如果信号量的计数器为 0调用 sem_wait 的线程会被阻塞直到信号量的计数器变得大于 0。此时线程会被唤醒并且信号量计数器会减少 1。 原子性sem_wait 的操作是原子性的这意味着在 sem_wait 执行过程中不会有其他线程或进程修改同一个信号量的状态从而避免竞态条件。 3、信号量的释放V操作sem_post sem_post 是 POSIX 标准中用于释放信号量的函数。它的作用是将信号量的计数器增加 1从而可能唤醒因等待信号量而被阻塞的线程或进程。 函数原型 int sem_post(sem_t *sem);参数说明 sem (sem_t *sem) 这是指向一个已经初始化的信号量对象的指针。信号量对象必须在调用 sem_post 之前通过 sem_init 或其他方式初始化。 返回值 成功返回 0。失败返回 -1并设置 errno 以指示错误类型。常见的错误包括 EINVAL无效的信号量描述符。 功能和行为 释放信号量 sem_post 函数将信号量的计数器增加 1。这个操作是原子性的即在执行期间不会被中断。 唤醒等待线程 如果有线程因调用 sem_wait 而被阻塞即信号量计数器为 0sem_post 会增加信号量的计数器并唤醒其中一个被阻塞的线程或进程使其可以继续执行。 计数器上限 在多数实现中信号量的计数器没有上限但实际限制取决于系统实现。在某些实现中信号量计数器的最大值可能受到系统限制因此要注意避免计数器溢出。 注意sem_post 通常与 sem_wait 配对使用确保在释放信号量时之前已经有线程因 sem_wait 被阻塞。否则如果没有线程在等待信号量sem_post 将增加计数器但不会产生实际的同步效果。 4、信号量的销毁sem_destroy sem_destroy 是 POSIX 标准中用于销毁信号量的函数。它的作用是释放与信号量对象相关的资源。在多线程或多进程编程中使用信号量后应确保在不再需要它们时调用 sem_destroy 来避免资源泄漏。  函数原型 int sem_destroy(sem_t *sem);参数说明 sem (sem_t *sem) 这是指向一个已经初始化的信号量对象的指针。该信号量必须在调用 sem_destroy 之前通过 sem_init 进行初始化并且在调用 sem_destroy 时不应有线程正在等待或使用该信号量。 返回值 成功返回 0。失败返回 -1并设置 errno 以指示错误类型。常见的错误包括 EINVAL信号量不是有效的信号量或未被初始化。EBUSY信号量正在被其他线程使用即已经有线程在等待或已经获取了该信号量。 功能和行为 释放资源 sem_destroy 会释放与信号量相关的系统资源。这是重要的一步尤其在使用动态分配的信号量时以防止内存泄漏。 适用场景 在信号量不再需要使用时调用例如在程序结束前或线程完成工作后。 注意事项 调用时机 只有在所有与信号量相关的线程已退出或不再使用该信号量时才能成功地调用 sem_destroy。如果有线程仍在等待该信号量调用将失败。 避免重复销毁 不应多次调用 sem_destroy 来销毁同一个信号量这可能导致未定义的行为。 初始化和销毁配对 每个通过 sem_init 初始化的信号量都应以 sem_destroy 完成销毁以确保资源的正确管理。 信号量使用代码示例  #include stdio.h #include stdlib.h #include semaphore.h #include pthread.h #include errno.hsem_t sem;void* worker(void* arg) {// 等待信号量if (sem_wait(sem) ! 0) {perror(sem_wait failed);pthread_exit(NULL);}// 进入临界区printf(Thread %ld acquired the semaphore.\n, (long)arg);// 模拟工作sleep(2);// 释放信号量if (sem_post(sem) ! 0) {perror(sem_post failed);pthread_exit(NULL);}printf(Thread %ld released the semaphore.\n, (long)arg);pthread_exit(NULL); }int main() {pthread_t threads[2];int i;// 初始化信号量初始值为 1if (sem_init(sem, 0, 1) ! 0) {perror(sem_init failed);exit(EXIT_FAILURE);}// 创建线程for (i 0; i 2; i) {pthread_create(threads[i], NULL, worker, (void*)(long)i);}// 等待线程完成for (i 0; i 2; i) {pthread_join(threads[i], NULL);}// 销毁信号量sem_destroy(sem);return 0; } 三、基于环形队列实现的生产者消费者模型 对于环形队列此前已经在数据结构中做过详细讲解大家可移步观看。 在数据结构章节中我们是如何判断环形队列是否为空或者为满呢——是通过队首坐标和队尾坐标是否相差“1”来判断的。这也就意味着在这种做法下我们需要牺牲一个空间。 实际上还有一种做法可以对环形队列的状态进行判断——使用一个计数器来实时记录环形队列中元素的个数。当像队列中添加数据时计数器 1当队列弹出数据时计数器 -1。当计数器为0或为我们所设定的队列最大容量时代表环形队列为空或已满。 如此我们就不必使用队首和队尾索引间的关系来对队列的状态进行判断。 而信号量的本质就是计数器自然也能做上述工作同时信号量还可以承担为线程分配资源的功能 生产者如何向环形队列中添加数据消费者又如何从队列中提取数据呢 队列的原则是“先进先出”当我们向队列中添加元素时应该从队尾开始添加。而提取元素时应从队首开始提取。 我们使用数组模拟环形队列由消费者代码控制队首索引 //生产者承担添加元素的操作形参为需要添加的对象的引用void Push(const T in){//1、申请一个代表空间资源的信号量该信号量的值 -1 —— P操作P(_space_nums);//2、去竞争临界区的互斥锁pthread_mutex_lock(_productor_mutex);//3、向队尾添加元素并让队尾索引指向下一个位置_ring_queue[_end] in;_end (_end 1) % _max_capacity;//4、解锁pthread_mutex_unlock(_productor_mutex);//5、此时生产者已经向环形队列中添加了一个数据//这意味着空间资源数量 -1 数据资源数量 1此时对代表数据资源的信号量进行 1 操作 —— V操作V(_data_nums);} 由生产者代码来控制队尾索引 //消费者承担提取元素的任务形参为指向所提取的元素的指针是输出型参数void Pop(T* out){//1、申请一个代表数据资源的信号量该信号量的值 -1 —— P操作P(_data_nums);//2、去竞争临界区的互斥锁pthread_mutex_lock(_consumer_mutex);//3、从队首提取元素并让队首索引指向下一个位置*out _ring_queue[_front];_front (_front 1) % _max_capacity;//4、解锁pthread_mutex_unlock(_consumer_mutex);//5、此时消费者已经从环形队列中提取了一个数据//这意味着数据资源数量 -1 空间资源数量 1此时对代表空间资源的信号量进行 1 操作 —— V操作V(_space_nums);}生产者关注的是空间资源消费者关注的是数据资源 对于生产者和消费者来说它们关注的资源是不同的 生产者关注的是环形队列当中是否有空间blank只要有空间生产者就可以进行生产。消费者关注的是环形队列当中是否有数据data只要有数据消费者就可以进行消费。 blank_sem和data_sem的初始值设置 现在我们用信号量来描述环形队列当中的空间资源blank_sem和数据资源data_sem在我们初始信号量时给它们设置的初始值是不同的 blank_sem的初始值我们应该设置为环形队列的容量因为刚开始时环形队列当中全是空间。data_sem的初始值我们应该设置为0因为刚开始时环形队列当中没有数据。 template typename T class RingQueue { private:sem_t _data_nums;//数组资源信号量sem_t _space_nums;//空间资源信号量pthread_mutex_t _productor_mutex;//生产操作临界区的互斥锁pthread_mutex_t _consumer_mutex;//消费操作临界区的互斥锁int _max_capacity; //环形队列的最大容量std::vectorT _ring_queue;//数组模拟环形队列int _front;//队首索引由消费者来维护int _end;//队尾索引由生产者来维护 public:RingQueue(int max_capicity MAXCAPACITY):_max_capacity(max_capicity), _ring_queue(max_capicity){_front _end 0;sem_init(_data_nums, 0, 0);//数据资源信号量初始化为0sem_init(_space_nums, 0, _max_capacity);//空间资源信号量初始化为环形队列的最大容量pthread_mutex_init(_productor_mutex, nullptr);pthread_mutex_init(_consumer_mutex, nullptr);} } 生产者申请空间资源释放数据资源 对于生产者来说生产者每次生产数据前都需要先申请blank_sem 如果blank_sem的值不为0则信号量申请成功此时生产者可以进行生产操作。如果blank_sem的值为0则信号量申请失败此时生产者需要在blank_sem的等待队列下进行阻塞等待直到环形队列当中有新的空间后再被唤醒。 当生产者生产完数据后应该释放data_sem 虽然生产者在进行生产前是对blank_sem进行的P操作但是当生产者生产完数据应该对data_sem进行V操作而不是blank_sem。生产者在生产数据前申请到的是blank位置当生产者生产完数据后该位置当中存储的是生产者生产的数据在该数据被消费者消费之前该位置不再是blank位置而应该是data位置。当生产者生产完数据后意味着环形队列当中多了一个data位置因此我们应该对data_sem进行V操作。 消费者申请数据资源释放空间资源 对于消费者来说消费者每次消费数据前都需要先申请data_sem 如果data_sem的值不为0则信号量申请成功此时消费者可以进行消费操作。如果data_sem的值为0则信号量申请失败此时消费者需要在data_sem的等待队列下进行阻塞等待直到环形队列当中有新的数据后再被唤醒。 当消费者消费完数据后应该释放blank_sem 虽然消费者在进行消费前是对data_sem进行的P操作但是当消费者消费完数据应该对blank_sem进行V操作而不是data_sem。消费者在消费数据前申请到的是data位置当消费者消费完数据后该位置当中的数据已经被消费过了再次被消费就没有意义了为了让生产者后续可以在该位置生产新的数据我们应该将该位置算作blank位置而不是data位置。当消费者消费完数据后意味着环形队列当中多了一个blank位置因此我们应该对blank_sem进行V操作。 必须遵守的两个规则 在基于环形队列的生产者和消费者模型当中生产者和消费者必须遵守如下两个规则。 第一个规则生产者和消费者不能对同一个位置进行访问。 生产者和消费者在访问环形队列时 如果生产者和消费者访问的是环形队列当中的同一个位置那么此时生产者和消费者就相当于同时对这一块临界资源进行了访问这当然是不允许的。而如果生产者和消费者访问的是环形队列当中的不同位置那么此时生产者和消费者是可以同时进行生产和消费的此时不会出现数据不一致等问题。 如下图 第二个规则无论是生产者还是消费者都不应该将对方套一个圈以上。 生产者从消费者的位置开始一直按顺时针方向进行生产如果生产者生产的速度比消费者消费的速度快那么当生产者绕着消费者生产了一圈数据后再次遇到消费者此时生产者就不应该再继续生产了因为再生产就会覆盖还未被消费者消费的数据。同理消费者从生产者的位置开始一直按顺时针方向进行消费如果消费者消费的速度比生产者生产的速度快那么当消费者绕着生产者消费了一圈数据后再次遇到生产者此时消费者就不应该再继续消费了因为再消费就会消费到缓冲区中保存的废弃数据。 如下图 四、完整代码 #include vector #include pthread.h #include semaphore.hconst int MAXCAPACITY 6; template typename T class RingQueue { private:sem_t _data_nums;//数组资源信号量sem_t _space_nums;//空间资源信号量pthread_mutex_t _productor_mutex;//生产操作临界区的互斥锁pthread_mutex_t _consumer_mutex;//消费操作临界区的互斥锁int _max_capacity; //环形队列的最大容量std::vectorT _ring_queue;//数组模拟环形队列int _front;//队首索引由消费者来维护int _end;//队尾索引由生产者来维护 public:RingQueue(int max_capicity MAXCAPACITY):_max_capacity(max_capicity), _ring_queue(max_capicity){_front _end 0;sem_init(_data_nums, 0, 0);//数据资源信号量初始化为0sem_init(_space_nums, 0, _max_capacity);//空间资源信号量初始化为环形队列的最大容量pthread_mutex_init(_productor_mutex, nullptr);pthread_mutex_init(_consumer_mutex, nullptr);}void P(sem_t* sem){sem_wait(sem);}void V(sem_t* sem){sem_post(sem);}//生产者承担添加元素的操作形参为需要添加的对象的引用void Push(const T in){//1、申请一个代表空间资源的信号量该信号量的值 -1 —— P操作P(_space_nums);//2、去竞争临界区的互斥锁pthread_mutex_lock(_productor_mutex);//3、向队尾添加元素并让队尾索引指向下一个位置_ring_queue[_end] in;_end (_end 1) % _max_capacity;//4、解锁pthread_mutex_unlock(_productor_mutex);//5、此时生产者已经向环形队列中添加了一个数据//这意味着空间资源数量 -1 数据资源数量 1此时对代表数据资源的信号量进行 1 操作 —— V操作V(_data_nums);}//消费者承担提取元素的任务形参为指向所提取的元素的指针是输出型参数void Pop(T* out){//1、申请一个代表数据资源的信号量该信号量的值 -1 —— P操作P(_data_nums);//2、去竞争临界区的互斥锁pthread_mutex_lock(_consumer_mutex);//3、从队首提取元素并让队首索引指向下一个位置*out _ring_queue[_front];_front (_front 1) % _max_capacity;//4、解锁pthread_mutex_unlock(_consumer_mutex);//5、此时消费者已经从环形队列中提取了一个数据//这意味着数据资源数量 -1 空间资源数量 1此时对代表空间资源的信号量进行 1 操作 —— V操作V(_space_nums);}~RingQueue(){sem_destroy(_data_nums);sem_destroy(_space_nums);pthread_mutex_destroy(_productor_mutex);pthread_mutex_destroy(_consumer_mutex);} }; 五、生产者消费者模型两种实现方法的对比  阻塞队列与条件变量的模型 在基于阻塞队列的实现中生产者和消费者之间使用条件变量进行同步而整个队列由一个互斥锁保护。这种方法的特点是将队列和同步机制视为一个整体进行管理 单一互斥锁使用一把锁来保护整个队列确保生产者和消费者在访问队列时不会同时进行操作避免数据竞争和不一致性。条件变量用来实现生产者和消费者之间的协调。生产者在队列满时等待消费者在队列空时等待。条件变量的等待和通知都依赖于持有的互斥锁。 优点 简单由于只需要一把锁代码实现和管理都相对简单。一致性锁保护了整个队列确保了在任何时刻队列的状态是一致的。 环形队列与信号量的模型 环形队列与信号量的实现方法通常涉及到两个独立的锁或信号量一个用于管理队列的访问另一个用于管理队列的空闲和满状态 两个独立的锁/信号量 互斥锁用于保护对队列的访问确保生产者和消费者在对队列进行操作时是互斥的——即保护线程对临界资源操作的原子性。信号量用来表示队列中的空位和数据项数量。生产者和消费者通过信号量进行同步但信号量与互斥锁是分开的。 优点 细化的控制信号量提供了对队列空闲和满状态的精细控制使得生产者和消费者可以更高效地进行等待和通知减少了不必要的等待时间。独立管理通过信号量生产者和消费者在访问队列的逻辑上是分开的互斥锁仅保护对队列的实际操作而信号量负责同步和状态管理。 为什么环形队列与信号量需要两个锁 资源管理的独立性         在环形队列的模型中互斥锁保护队列的操作如插入和删除而信号量管理队列的状态如队列空闲和满状态。这两个机制的职责不同因此需要独立的锁/信号量来实现更精细的控制。 提高效率         使用信号量来管理空闲和满状态可以减少生产者和消费者之间的等待时间。生产者和消费者可以在不同的信号量上进行操作而不需要在操作队列时额外等待从而提高了系统的效率。 避免复杂的锁竞争         在使用信号量的情况下生产者和消费者可以在互斥锁保护的范围之外进行状态检查和信号操作从而减少了对互斥锁的竞争和锁持有的时间。 总结 阻塞队列与条件变量的模型一个互斥锁保护整个队列条件变量用于协调生产者和消费者。这种方法简单且一致性好适合于简单的生产者消费者问题。 环形队列与信号量的模型两个独立的锁/信号量分别管理队列的访问和状态。这种方法提供了更细粒度的控制提高了效率但实现和管理上相对复杂。 简而言之在基于环形队列实现的模型中生产者所关注的空间资源信号量和消费者所关注的数据资源信号量提供了对临界资源更精细化的控制。 在阻塞队列模型中生产者和消费者每次对临界资源的操作都是对整个阻塞队列进行操作。 而在环形队列模型中由于生产者和消费者管理着环形队列的不同索引他们对临界资源的操作实际上是两种分开的不同的逻辑。 在阻塞队列中互斥锁的作用主要是保护阻塞队列的线程安全。同样的环形队列模型中的互斥锁也是为了保护环形队列的线程安全。不同的是由于生产者和消费者的代码逻辑是分开独立的所以生产者和消费者线程各自持有属于各自的互斥锁即可。这样不仅保证了临界资源操作的原子性还减少了不必要的对互斥锁的竞争操作
文章转载自:
http://www.morning.lrflh.cn.gov.cn.lrflh.cn
http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn
http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn
http://www.morning.xwgbr.cn.gov.cn.xwgbr.cn
http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn
http://www.morning.mpngp.cn.gov.cn.mpngp.cn
http://www.morning.jtrqn.cn.gov.cn.jtrqn.cn
http://www.morning.ldqrd.cn.gov.cn.ldqrd.cn
http://www.morning.ccyjt.cn.gov.cn.ccyjt.cn
http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn
http://www.morning.qwqzk.cn.gov.cn.qwqzk.cn
http://www.morning.zpqk.cn.gov.cn.zpqk.cn
http://www.morning.nhzzn.cn.gov.cn.nhzzn.cn
http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn
http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com
http://www.morning.kjawz.cn.gov.cn.kjawz.cn
http://www.morning.nbiotank.com.gov.cn.nbiotank.com
http://www.morning.bpmdn.cn.gov.cn.bpmdn.cn
http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn
http://www.morning.qgwpx.cn.gov.cn.qgwpx.cn
http://www.morning.bmbnc.cn.gov.cn.bmbnc.cn
http://www.morning.qphcq.cn.gov.cn.qphcq.cn
http://www.morning.zrgsg.cn.gov.cn.zrgsg.cn
http://www.morning.yrms.cn.gov.cn.yrms.cn
http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn
http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn
http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn
http://www.morning.kpxzq.cn.gov.cn.kpxzq.cn
http://www.morning.yltnl.cn.gov.cn.yltnl.cn
http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn
http://www.morning.slpcl.cn.gov.cn.slpcl.cn
http://www.morning.errnull.com.gov.cn.errnull.com
http://www.morning.skdhm.cn.gov.cn.skdhm.cn
http://www.morning.zmzdx.cn.gov.cn.zmzdx.cn
http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn
http://www.morning.hfnbr.cn.gov.cn.hfnbr.cn
http://www.morning.pzjrm.cn.gov.cn.pzjrm.cn
http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn
http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn
http://www.morning.wdprz.cn.gov.cn.wdprz.cn
http://www.morning.fhykt.cn.gov.cn.fhykt.cn
http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn
http://www.morning.hjsrl.cn.gov.cn.hjsrl.cn
http://www.morning.ggrzk.cn.gov.cn.ggrzk.cn
http://www.morning.ppdr.cn.gov.cn.ppdr.cn
http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn
http://www.morning.qphgp.cn.gov.cn.qphgp.cn
http://www.morning.qbkw.cn.gov.cn.qbkw.cn
http://www.morning.mxgpp.cn.gov.cn.mxgpp.cn
http://www.morning.dbdmr.cn.gov.cn.dbdmr.cn
http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn
http://www.morning.sxygc.cn.gov.cn.sxygc.cn
http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn
http://www.morning.iterlog.com.gov.cn.iterlog.com
http://www.morning.haolipu.com.gov.cn.haolipu.com
http://www.morning.tqdqc.cn.gov.cn.tqdqc.cn
http://www.morning.hhfqk.cn.gov.cn.hhfqk.cn
http://www.morning.nxkyr.cn.gov.cn.nxkyr.cn
http://www.morning.brhxd.cn.gov.cn.brhxd.cn
http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn
http://www.morning.wqpb.cn.gov.cn.wqpb.cn
http://www.morning.krklj.cn.gov.cn.krklj.cn
http://www.morning.yrpd.cn.gov.cn.yrpd.cn
http://www.morning.pslzp.cn.gov.cn.pslzp.cn
http://www.morning.pgfkl.cn.gov.cn.pgfkl.cn
http://www.morning.mslhq.cn.gov.cn.mslhq.cn
http://www.morning.rqnml.cn.gov.cn.rqnml.cn
http://www.morning.zbkdm.cn.gov.cn.zbkdm.cn
http://www.morning.wcyr.cn.gov.cn.wcyr.cn
http://www.morning.hpkgm.cn.gov.cn.hpkgm.cn
http://www.morning.gccdr.cn.gov.cn.gccdr.cn
http://www.morning.kkzwn.cn.gov.cn.kkzwn.cn
http://www.morning.kchwr.cn.gov.cn.kchwr.cn
http://www.morning.ccphj.cn.gov.cn.ccphj.cn
http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn
http://www.morning.szzxqc.com.gov.cn.szzxqc.com
http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn
http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn
http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn
http://www.morning.hclplus.com.gov.cn.hclplus.com
http://www.tj-hxxt.cn/news/271820.html

相关文章:

  • 小说网站开发教程wordpress 显示所有分类
  • 做ui设计用什么素材网站外包网站开发安全吗
  • 网站建设需要考啥证设计 网站 现状
  • 周口高端网站建设建设网站的五个步骤是
  • 上海市交通建设工程安全质量监督站网站网站图片是用什么软件做的
  • 国内做免费视频网站国外搜索网站排名
  • 网站规划与建设课程网站建设一般步骤是什么
  • 咋么做网站app软件开发专业公司
  • 中国建设银行网站类型网页设计与制作就业前景
  • 导购类网站建设多少钱成都六度网站建设
  • 网站制作的一般步骤是什么网站的前端开发
  • 免费站长统计工具wordpress html编辑
  • 免费的课程设计哪个网站有重庆微信网站建设多少钱
  • 深圳安鸿源建设网站网站开发完成情况说明
  • 个人网站制作教程网站建设与管理教程视频
  • 电脑可以做网站主机么开发前端后端
  • gps建站教程视频个人网站百度推广收费
  • 毕业设计做网站怎么样给公众号做头像的网站
  • 婚纱摄影网站开发背景秦皇岛建设规划局
  • 深圳网站模板网络营销方式英语
  • 南宁伯才网络公司做网站好吗seo服务哪家好
  • 宁晋做网站网站开发英文论文
  • 深圳网站制作有名 乐云践新企业网站建设兴田德润实惠
  • 青岛网页建站模板苏州市吴江区建设局网站
  • 番禺做网站最便宜的哪家公司唯品会网站建设的目标
  • 化妆品网站建设目标wordpress 头像本地化
  • ukidc做电影网站淘宝客怎么做直播网站
  • 网站开发前端需要学什么建湖网站设计
  • 网站设计方案案例wordpress小程序课程
  • 成都科技网站建设联系广州市线下教学