精华内容
下载资源
问答
  • 多个线程调用同一个函数的同步问题。
  • 多个线程调用同一个线程函数

    千次阅读 2012-03-08 20:15:53
    多个线程调用同一个线程函数 悬赏分:50 - 解决时间:2007-12-11 13:59 如题,能这样吗?因为有很多个操作,但是这些操作都是一样的,所以想用相同的线程函数,但是感觉运行时线程还是一个一个运行,并没有...
    多个线程调用同一个线程函数
    悬赏分:50 - 解决时间:2007-12-11 13:59
    如题,能这样吗?因为有很多个操作,但是这些操作都是一样的,所以想用相同的线程函数,但是感觉运行时线程还是一个一个运行,并没有提高速度,应该是我理解错了!!老大些帮帮忙,给个建议 
    问题补充:
    我的意思是线程处理函数,刚刚找了点资料,觉得这想法没有错,只要线程里面不用全局或者静态变量就行,要用就要锁,主要是这个问题,你这个模板太好了,我就想用这个,非常感谢
    提问者: 76073424 - 二级
    最佳答案
    你提到的线程函数是一般函数还是生成线程的函数,或是用于运行特定函数的线程?
    
    如果是在用VC中想用多个线程运行同样的任务,而这些任务之间没有通讯问题和内存共享的问题,那可以用下面的模板:
    DWORD WINAPI TaskThreadProc(LPVOID)
    {
    // 独立任务
    // ...
    }
    
    void RunTaskUseMultiThread(int nThreadCount) // 线程个数为nThreadCount
    {
    HANDLE* threads = new HANDLE[nThreadCount]; // 线程句柄,对线程进行状态的控制时用到
    DWORD* idThreads = new DWORD[nThreadCount]; // 线程id,给线程发消息时用到
    int i;
    for (i = 0; i < nThreadCount; i++)
    {
    threads[i] = CreateThread( NULL, 0, TaskThreadProc, NULL, CREATE_SUSPENDED, &idThreads[i]); // 创建线程
    }
    for (i = 0; i < nThreadCount; i++) // 由于生成的是CREATE_SUSPENDED的线程,所以这里开始让线程开始运行
    ResumeThread(threads[i]);
    WaitForMultipleObjects(nThreadCount, threads, TRUE, INFINITE); // 等待线程运行结束
    for (i = 0; i < nThreadCount; i++)
    CloseHandle(threads[j]); // 销毁线程
    delete [] threads;
    delete [] idThreads;
    } 
    展开全文
  • 问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么? 为了调查这个问题,我决定从以下三方面调查 1.线程中函数的调用 2.同...

    问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么?

    为了调查这个问题,我决定从以下三方面调查

    1.线程中函数的调用

    2.同一个进程中的两个线程调用同一个处理函数

    3.两个不同进程中的两个线程调用同一个处理函数


    1.线程中函数的调用

    每个进程都会有自己的虚拟地址空间,同一个进程中的每个线程都会在这个虚拟空间中,并被分配相应的资源。
    线程中的函数实体是在内存中,而函数中的局部变量则会一次被push到栈中。
    如果是A函数调用B函数,则会先将A函数的参数和局部变量push到队列中,再将B函数的参数和局部变量push到队列中
    具体如下(参数是以从右到左压入栈中,__stdcall与__cdecl调用约定都是这么处理的):

    void fun(param1, param2,. param3....paramN)
    {
    value1;
    value2;
    ...
    valueN;
    }

    如果执行上面的函数在栈中会这样变化

    1:将fun函数的入力参数从右到左依次压入到栈中。

    2:将fun函数的指针压入栈中

    3:将ebp,ebx等寄存器入栈保存
    4:在栈中依次为各个变量分配空间

    执行后的处理:

    1.释放变量空间

    2.弹出个寄存器

    3.ret,弹出eip,返回主调方代码

    4.释放参数空间

    2.两个线程调用同一个函数

    两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理

    3.两个不同进程中的两个线程调用同一个处理函数

    同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理

    结论:
    因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送之类的操作需要进行互斥处理

    转载地址:
    展开全文
  • 原文地址:http://blog.csdn.net/mq_ydn3102/article/details/8546722问题背景:在工作中遇到过一个问题,就是在两个线程同时...同一个进程中的两个线程调用同一个处理函数3.两个不同进程中的两个线程调用同一个处理...

    原文地址:http://blog.csdn.net/mq_ydn3102/article/details/8546722

    问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么?

    为了调查这个问题,我决定从以下三方面调查

    1.线程中函数的调用

    2.同一个进程中的两个线程调用同一个处理函数

    3.两个不同进程中的两个线程调用同一个处理函数

    1.线程中函数的调用

    每个进程都会有自己的虚拟地址空间,同一个进程中的每个线程都会在这个虚拟空间中,并被分配相应的资源。
    线程中的函数实体是在内存中,而函数中的局部变量则会一次被push到栈中。
    如果是A函数调用B函数,则会先将A函数的参数和局部变量push到队列中,再将B函数的参数和局部变量push到队列中
    具体如下(参数是以从右到左压入栈中,__stdcall与__cdecl调用约定都是这么处理的):

    void fun(param1, param2,. param3....paramN)
    {
        value1;
        value2;
        ...
        valueN;
    }

    如果执行上面的函数在栈中会这样变化

    1:将fun函数的入力参数从右到左依次压入到栈中。

    2:将fun函数的指针压入栈中

    3:将ebp,ebx等寄存器入栈保存

    4:在栈中依次为各个变量分配空间

    执行后的处理:

    1.释放变量空间

    2.弹出个寄存器

    3.ret,弹出eip,返回主调方代码

    4.释放参数空间

    2.两个线程调用同一个函数

    两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理

    3.两个不同进程中的两个线程调用同一个处理函数

    同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理

    结论:
    因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送之类的操作需要进行互斥处理

    展开全文
  • 如果是在用VC中想用多个线程运行同样的任务,而这些任务之间没有通讯问题和内存共享的问题(只要线程里面不用全局或者静态变量就行,要用就要锁)那可以用下面的模板: DWORD WINAPI TaskThreadProc(LPVOID) { // ...

    如果是在用VC中想用多个线程运行同样的任务,而这些任务之间没有通讯问题和内存共享的问题(只要线程里面不用全局或者静态变量就行,要用就要锁)那可以用下面的模板:
    DWORD WINAPI TaskThreadProc(LPVOID)
    {
    // 独立任务
    // ...
    }

    void RunTaskUseMultiThread(int nThreadCount) // 线程个数为nThreadCount
    {
    HANDLE* threads = new HANDLE[nThreadCount]; // 线程句柄,对线程进行状态的控制时用到
    DWORD* idThreads = new DWORD[nThreadCount]; // 线程id,给线程发消息时用到
    int i;
    for (i = 0; i < nThreadCount; i++)
    {
    threads[i] = CreateThread( NULL, 0, TaskThreadProc, NULL, CREATE_SUSPENDED, &idThreads[i]); // 创建线程
    }
    for (i = 0; i < nThreadCount; i++) // 由于生成的是CREATE_SUSPENDED的线程,所以这里开始让线程开始运行
    ResumeThread(threads[i]);
    WaitForMultipleObjects(nThreadCount, threads, TRUE, INFINITE); // 等待线程运行结束
    for (i = 0; i < nThreadCount; i++)
    CloseHandle(threads[j]); // 销毁线程
    delete [] threads;
    delete [] idThreads;
    }

    展开全文
  • 我想关键在于:每一个内循环都要调用同一个m_Surfaces[iSurface]对象的IntersectionOfCurveSurface函数,所以当不同的曲线对同一个曲面求交时,即多个线程同时调用同一个对象的成员函数时,速度没有同线程数成正比...
  • 多线程调用同一个函数

    千次阅读 2009-10-16 11:57:00
    public void receive(int i)//线程传入参数 { n++;//全局变量 string s=n.ToString()+"@@@@"+i.ToString(); Thread.Sleep(20); Console.WriteLine(s+"--"+n.ToString() +
  • C++多个线程调用同一个dll中的一个函数,但是要求这个函数同一时刻只能被有限个线程调用。因为这个函数使用了一些有限资源,当资源不够时,希望该函数直接返回。dll函数是用“C”方式导出的。抱歉,没多少分了,拜谢...
  • 线程调用一个函数,在不设锁的情况下,把可能产生数据冲突的实参都设为二维指针,这样可行吗?
  • 为了代码的简洁,编程的时候经常会对函数进行复用, 最近工作中出现了一个函数复用导致的频繁段错误,因此同一个函数多线程调用的时候到底需不需要加锁,原因是什么,请看一下分析。   转载自:...
  • 实际 情况 是,控制卡控制每一条轴回原点,而每条轴回原点其实只要传入轴号,回原点的代码可以用同一个函数, 没有顺序要求,只要都 执行完这个回原点函数就行。大概有8个轴, 如果我弄8个线程回感觉又太了,我...
  • 如题 在开发系统时 多个类需要调用同一个静态方法有可能会同时发生, 静态方法中没有静态变量 那么会不会出现线程安全问题呢 如下测试 开启 3 个线程 线程睡眠时间逐渐减少 共同调用同一个静态方法 静态方法输出传入...
  • 多线程调用函数理解

    千次阅读 2012-12-13 11:16:29
    1.多线程调用同一个函数的理解 线程调用一个函数和一个线程调用一个函数是一样的,关键要看你的函数是否使用了一些全局的东西。 函数的调用有自己的栈,每个函数的栈都是独立的. 唯一要考虑的是,在调用这个...
  • 这如何是好?
  • 线程时,几个线程间输出信息是交叉在一起的,但你又没有区分是哪个线程输出的,所以你自己就误认为是同一个线程输出的东西被改变了.实际上是你自己的理解错误. 所有线程都用cout输出内容,你如何判断哪些内容是哪个...
  • 本文介绍解决“多线程调用printf函数时,输出不同步”问题的方法。 1、问题 printf函数时编程时经常使用的函数,但时由于printf函数涉及到和显示器或磁盘等外设的交互,所以操作涉及到从“用户态-内核态-用户态”...
  • 多个线程,使用不同的参数来调用同一个函数是否会导致结果数据乱套? 我现在的代码如下,感觉得到的数据好像不正常。 应该如何操作才是正确的呢? 请大伙指点,谢谢 Thread t = new Thread(new ...
  • * 创建线程或者进程的开销是很大的 ...* 往往会建立一个线程池用于多线程程序的调度 * 下面的程序就是完整的线程池实现 * * 主要通过互斥量和条件变量实现同步 * 本文件中定义了线程池的数据结构和所有的函数
  • string SQLConstr="Server=192.168.0.111;DataBase=Mysqldb;Integrated Security=SSPI;Connect Timeout=5"; SqlConnection sqlConnection=new ...上面步骤在并行线程次执行,之前线程正常关闭db connection
  • 在报错时进行sync同步处理,处理第一个goroutine的错误前,errNum加1,判断errNum的值,大于1则return结束函数,否则执行函数handleEr 2.加锁。当一个线程访问到handleError()时,立马给handleError()加锁,禁止其他...
  • 同步函数用的是哪一个锁呢? 函数需要被对象调用。那么函数都有一个所属对象引用。就是this。 所以同步函数使用的锁是this。通过该程序进行验证。使用两个线程来买票。 一个线程在同步代码块中。 一个线程在同步函数...
  • 多线程函数理解

    2019-09-23 09:43:59
    多线程调用同一个函数的理解 线程调用一个函数和一个线程调用一个函数是一样的,关键要看你的函数是否使用了一些全局的东西。 函数的调用有自己的栈,每个函数的栈都是独立的. 唯一要考虑的是,在调用这个函数中...
  • 1.Qt下,多线程使用互斥锁安全访问同一全局变量;2.源码中定义了ThreadA和ThreadB,定义变量后,依次调用函数start()来启动重写的run()函数
  • 那么函数都有一个所属对象引用。就是this。 所以同步函数使用的锁是this。 通过该程序进行验证。 使用两个线程来买票。 一个线程在同步代码块中。一个线程在同步函数中。都在执行买票动作。 代码如下: ...
  • 这种同步方法通常可以用在post中,拨号前先同步可能避免数据没有返回就启动了拨号 需要调用到四windows API函数 CreateEvent ResetEvent SetEvent WaitForSingleObject 效果图
  • /* 同步函数用的是哪一个锁呢? 函数需要被对象调用。那么函数都有一个所属对象引用。就是this。 所以同步函数使用的锁是this。...说明使用的两个线程使用的不是同一个锁 */ class Ticket implements Runnable
  • 直接调用Windows相关线程及同步对象的API即可。 在.NET framework进阶编程中,可以用基于delegate的方式来处理界面保持活动,而后台作大运算量或耗时的操作。 应用程序的需求是:点击一个按钮来刷新用户界面
  • 同一个线程对象是不能调用start函数开辟线程 (例)以下代码的12行会报错,虽然12行代码执行时第一次开辟线程运行的run函数已经结束 代码: 1) public class MyThread extends Thread { 2) @Override 3)...
  • 多个线程公用函数

    2011-07-27 22:36:37
    多线程访问同一个函数为什么要互斥呢?如果函数是可重入的,就没有这样的问题,随便你怎样访问,每次都会是不同的堆栈来处理这个函数调用吧。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,742
精华内容 696
关键字:

多个线程调用同一个函数