在C/C++中,如果我有以下功能:
void foo();
void bar(void (*funcPtr)());
Run Code Online (Sandbox Code Playgroud)
这两个电话之间有区别吗:
bar(foo);
bar(&foo);
Run Code Online (Sandbox Code Playgroud)
?
我想知道一个程序是否可以同时运行两个线程(基本上它是用于正确的?).但是,如果我在一个函数中进行系统调用,它在线程A上运行,并且在另一个函数中运行一些其他任务,它在线程B上运行,它们是否能够同时运行或者我的第二个运行功能等到系统调用完成?
我的原始问题的附加组件:现在,当系统调用正在进行时,此过程仍然是一个不间断的过程吗?我在谈论在UNIX/LINUX上使用任何系统调用.
对于学校的一个小项目,我需要创建一个简单的客户端/服务器结构,将一台路由器(与OpenWrt的)上运行,我试图做这个应用程序线程的东西.
我的C++技能非常有限,所以我在互联网上发现这是一个基本的例子.
#include <thread>
#include <iostream>
void doSomeWork( void )
{
std::cout << "hello from thread..." << std::endl;
return;
}
int main( int argc, char *argv[] )
{
std::thread t( doSomeWork );
t.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在Xcode(4.5.2)中运行它时,我收到以下错误:
尝试使用已删除的功能
它显示了一些代码:
__threaad_execute(tuple<_Fp, _Args...>& __t, __tuple_indices<_Indices...>)
{
__invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
}
Run Code Online (Sandbox Code Playgroud)
我想我需要用"构建设置"或"链接库"或其他东西做些什么吗?但我不太确定该怎么做.我想我可能需要设置以下设置(我在这里找到)
但那些已经设定的设置.
有没有国旗/图书馆或我遗失的东西?
我正在寻找跨平台的C++主/工作库或工作队列库.一般的想法是我的应用程序将创建某种Task或Work对象,将它们传递给工作主服务器或工作队列,这反过来又会在单独的线程或进程中执行工作.为了提供一些上下文,应用程序是一个CD开膛手,我想要并行化的任务是"rip track","将WAV编码为Mp3"等.
我的基本要求是:
如果这个库也是特别好的:
通过类比,我正在寻找类似于Java的ExecutorService或其他类似的线程池库,但是在跨平台的C++中.有谁知道这样的野兽?
谢谢!
当然,我无法将指向方法的指针传递给CreateThread函数.我该怎么办?
可能重复:
C++中线程的简单示例
有人可以举个例子来说明如何在C++中创建一个同时运行两个函数的简单应用程序吗?我知道这个问题与线程管理和多线程有关,但我基本上是一个php程序员,我并不熟悉高级C++编程.
这是我想要做的,我希望 main() 中的一部分代码在连续循环中运行以检查输入和其他内容。另一部分代码每 X 毫秒延迟运行一次。
while(true) //want this to run continuously, without any delay.
{
Input();
}
while(true) //want this to run every 1500 miliseconds.
{
DoSomething();
Sleep(1500); //from <windows.h> library.
}
Run Code Online (Sandbox Code Playgroud)
有没有办法正确地做到这一点?
我正在使用VS2012,我不能在我的程序中执行一个线程而不会崩溃.应该注意,我的程序包含OpenGL和SOIL.
我只是在我的一个函数中调用一个空白线程,一个没有语句的函数,它立即崩溃:
void service(){
}
/* Connect to server */
void connectToServer(){
cout << "~CLIENT~\n" << endl;
std::thread serverConnect(service);
}
Run Code Online (Sandbox Code Playgroud)
当程序调用connectToServer()
它时,它会在call语句中std::thread serverConnect(service);
使用以下调用栈中断:
msvcr110.dll!_crt_debugger_hook(int _Reserved) Line 60 C
msvcr110.dll!_call_reportfault(int nDbgHookCode, unsigned long dwExceptionCode, unsigned long dwExceptionFlags) Line 152 C++
msvcr110.dll!abort() Line 90 C
msvcr110.dll!terminate() Line 96 C++
IRC.exe!connectToServer() Line 449 C++
IRC.exe!handleKeypress(unsigned char key, int x, int y) Line 936 C++
glut32.dll!1000e054() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for glut32.dll]
glut32.dll!1000d5de() Unknown …
Run Code Online (Sandbox Code Playgroud) 我有代码,我必须并行地运行parallel_for(彼此独立).
代码是这样的:
tbb::parallel_for(range1,func1());//first
tbb::parallel_for(range2,func2());//second
tbb::parallel_for(range3,func3());//third
Run Code Online (Sandbox Code Playgroud)
我尝试过使用task_group.还有其他方法吗?
我有一个用C++编码的迭代过程需要很长时间,我正在考虑将我的代码转换为使用多个线程.但我担心它可能非常复杂并且存在锁定和错误的风险.但是我怀疑对于这个特殊的问题它可能是微不足道的,但我想要确认.
我希望我可以使用这里简单的线程代码.
我的程序使用了大量的全局数组和结构.我假设如果其他线程试图同时读取相同的数据,则各个线程不需要关注它们.
我还假设如果一个线程想要通过1.5增加一个全局浮点变量而另一个线程想要减去0.1,那么只要我不关心事件的顺序,那么两个线程都会成功完成它们的任务而不用任何特殊代码(如互斥锁和锁等)和浮动最终会增加1.4.如果我所有的假设都是正确的那么我的任务将很容易 - 请告知.
编辑:只是为了使它绝对清楚 - 浮点数递增/递减的顺序并不重要.只要它的价值最终增加1.4,那么我很高兴.在所有线程完成任务之后才会读取 float的值.
编辑:作为一个更具体的例子,成像我们的任务是找到来自美国不同州的慈善机构的捐款总额.我们可以拥有这样的全球:
float total_donations= 0;
Run Code Online (Sandbox Code Playgroud)
然后我们可以有50个单独的线程,每个线程计算一个名为donations_from_this_state的本地浮点数.并且每个线程将单独执行:
total_donations += donations_from_this_state;
Run Code Online (Sandbox Code Playgroud)
显然,线程执行其任务的顺序对最终结果没有任何影响.
c++ ×9
c ×1
concurrency ×1
opengl ×1
parallel-for ×1
pointers ×1
tbb ×1
threadpool ×1
winapi ×1
windows ×1
xcode ×1