多线程-创建线程过多会出现线程不执行问题?

问题描述

创建线程过多会出现线程不执行问题?

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;

DWORD CALLBACK ThreadFun_02(LPVOID lp);
bool PrintLog(const char * pString);
CRITICAL_SECTION g_Cs;
int g_iTickets = 20;
int main()
{
InitializeCriticalSection(&g_Cs);

  PrintLog("开始创建线程");
  for(int i=0;i<g_iTickets;i++)
  {
        if(!CreateThread(NULL, 0, ThreadFun_02, NULL, 0, NULL))
        {
              PrintLog("创建线程失败!
");
        }
  }

   cin.get();
   cout<<g_iTickets<<endl;
   cin.get();
  return 0;

}

DWORD CALLBACK ThreadFun_02(LPVOID lp)
{
EnterCriticalSection(&g_Cs);
if(g_iTickets > 0)
{
char szChar[20];
sprintf_s(szChar, "Sell ticket: %d", g_iTickets);
cout<<szChar<<endl;
PrintLog(szChar);
g_iTickets--;
}

  LeaveCriticalSection(&g_Cs);

  return 0;

}

bool PrintLog(const char * pString)
{
EnterCriticalSection(&g_Cs);
FILE *cLog = NULL;
cLog = fopen("Test.log", "a");

  if(!cLog)
  {
        return false;
  }

  fputs(pString, cLog);
  fputc('
', cLog);
  fclose(cLog);

  LeaveCriticalSection(&g_Cs);
  return true;

}

代码如上,正常情况下最后输出的g_iTickets应该为0,但是如果g_iTickets过多(如50,100),就会出现最后的g_iTickets不为0的情况.这是什么情况呢?

g_iTickets=20情况下输出:
...
Sell ticket: 9
Sell ticket: 8
Sell ticket: 7
Sell ticket: 6
Sell ticket: 5
Sell ticket: 4
Sell ticket: 3
Sell ticket: 2
Sell ticket: 1

0

g_iTickets=50情况下输出:
...
Sell ticket: 9
Sell ticket: 8
Sell ticket: 7
Sell ticket: 6
Sell ticket: 5
Sell ticket: 4
Sell ticket: 3
Sell ticket: 2

1

g_iTickets=1000情况下输出:
Sell ticket: 45
Sell ticket: 44
Sell ticket: 43
Sell ticket: 42
Sell ticket: 41
Sell ticket: 40
Sell ticket: 39
Sell ticket: 38
Sell ticket: 37

36

解决方案

linux环境下的线程的创建问题
C++创建线程问题 一段可用代码
MFC 线程创建的问题

解决方案二:

http://blog.csdn.net/chen825919148/article/details/7904219

解决方案三:

首先看你线程过多的时候,是否创建成功了这么多线程。
其次就是你的主线程有么有等待其他线程都执行完成,而不是主线程已经先退出了。

时间: 2024-10-03 01:20:17

多线程-创建线程过多会出现线程不执行问题?的相关文章

MFC多线程创建文件写数据

问题描述 MFC多线程创建文件写数据 初始化线程时创建文件如下(以当前时间命名文件于当前进程的当前目录): if(hThread)//初始化线程 { cTime = cTime.GetCurrentTime(); tmp = cTime.Format(_T(""%Y%m%d%H%M%S"")); GetCurrentDirectory(MAX_PATH path);//返回当前进程的当前目录 str_file_netpath.Format(_T("&quo

浅谈.NET下的多线程和并行计算(二)线程基本知识

首先来看看如何创建线程: Console.WriteLine(Process.GetCurrentProcess().Threads.Count); Thread t1 = new Thread(() => { Thread.Sleep(1000); Thread t = Thread.CurrentThread; Console.WriteLine("Name: " + t.Name); Console.WriteLine("ManagedThreadId: &quo

多线程-使用多个线程池还是一个线程池

问题描述 使用多个线程池还是一个线程池 最近在技术理论上遇到一个问题,不知道怎么解决. 问题描述:我们交易平台有4个商品(A.B.C.D)需要进行现在交易,交易的核心方法dealorder是 一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法. @Transactional public synchronized Message dealOrder() CPU核心数是固定的,假如为6核心,目前就存在一个问题, 情况1:假如说

《C++多线程编程实战》——.7 线程模型的实现

2.7 线程模型的实现 我们可以把进程看作是一个对象,它的任务就是把相关资源分组.每个进程都有一个地址空间,如图2.10所示. 图2.10 进程的地址空间 这个所谓的进程图像必须在初始化CreateProcess时加载至物理内存中.所有的资源(如文件句柄.子进程的信息.信号处理器等)都被储存起来.把它们以进程的形式分组在一起,更容易管理. 除进程外,还有一个重要的概念是线程.线程是CPU可执行调度的最小单位.也就是说,进程本身不能获得CPU时间,只有它的线程才可以.线程通过它的工作变量和栈来储存

银行取款[多线程]{使用同步代码块确保线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题. 此处用多线程实现,同时取款的模拟实现,使用同步代码块确保线程同步,查看取款安全隐患问题,代码如下: --------------------------------------------------------------------------------------------------------------------------------------  * 线程同步 :使用同步块

详解Java多线程编程中LockSupport类的线程阻塞用法_java

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到"Thread.suspend 和 Thread.resume所可能引发的死锁"问题. 因为park() 和 unpark()有许可的存在:调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性. 基本用法LockSupport 很类似于二元信号量

Java基础-23总结多线程,线程实现Runnable接口,线程名字获取和设置,线程控制,线程安全,同步线程

你需要的是什么,直接评论留言. 获取更多资源加微信公众号"Java帮帮" (是公众号,不是微信好友哦) 还有"Java帮帮"今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程的意义? 提高

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一.Thread 如何在自定义的代码中,自定义一个线程呢? 我们查看API文档,我们要启动一个线程,先实现一个子类, package com.lgl.hellojava; public class MyThread extends Thread { @Override public void run()

Java基础-创建Java程序中的线程池

程序|创建 线程是Java的一大特性,它可以是给定的指令序列.给定的方法中定义的变量或者一些共享数据(类一级的变量).在Java中每个线程有自己的堆栈和程序计数器(PC),其中堆栈是用来跟踪线程的上下文(上下文是当线程执行到某处时,当前的局部变量的值),而程序计数器则用来跟踪当前线程正在执行的指令. 在通常情况下,一个线程不能访问另外一个线程的堆栈变量,而且这个线程必须处于如下状态之一: 1.排队状态(Ready),在用户创建了一个线程以后,这个线程不会立即运行.当线程中的方法start()被调