以下程序显示了我们可以使用return
或pthread_exit
返回的状态变量void*
可用pthread_join
的变量。
是否应该优先使用一个而不是另一个?
为什么使用退货有效?通常我们考虑将return值放到堆栈上,但是由于线程完成了,堆栈应该消失了。还是直到之后堆栈才被销毁pthread_join
?
在您的工作中,您看到status变量有很多用途吗?看来我看到90%的代码只是将status参数设为NULL。由于通过void*
ptr 进行的任何更改都已经反映在调用线程中,因此返回它似乎没有多大意义。void*
返回的任何新ptr都必须指向malloc
启动线程编辑的内容,从而使接收线程负责处理它。我认为状态变量是半毫无意义的,这是错误的吗?
这是代码:
#include <iostream>
#include <pthread.h>
using namespace std;
struct taskdata
{
int x;
float y;
string z;
};
void* task1(void *data)
{
taskdata *t = (taskdata *) data;
t->x += 25;
t->y -= 4.5;
t->z = "Goodbye";
return(data);
}
void* task2(void *data)
{
taskdata *t = (taskdata *) data;
t->x -= 25;
t->y += 4.5;
t->z = "World";
pthread_exit(data);
}
int main(int argc, char *argv[])
{
pthread_t threadID;
taskdata t = {10, 10.0, "Hello"};
void *status;
cout << "before " << t.x << " " << t.y << " " << t.z << endl;
//by return()
pthread_create(&threadID, NULL, task1, (void *) &t);
pthread_join(threadID, &status);
taskdata *ts = (taskdata *) status;
cout << "after task1 " << ts->x << " " << ts->y << " " << ts->z << endl;
//by pthread_exit()
pthread_create(&threadID, NULL, task2, (void *) &t);
pthread_join(threadID, &status);
ts = (taskdata *) status;
cout << "after task2 " << ts->x << " " << ts->y << " " << ts->z << endl;
}
输出为:
before 10 10 Hello
after task1 35 5.5 Goodbye
after task2 10 10 World
(1)在C
代码中,using
return
导致
pthread_exit
取消堆栈堆栈和销毁局部变量,而只能保证调用已注册的取消处理程序
pthread_cancel_push()
。在某些系统上,此机制还将导致调用C
局部变量的析构函数,但是对于可移植代码而言,这是不能保证的—查看平台文档。
此外,在main()
,return
将隐式调用exit()
,从而终止程序,而pthread_exit()
只会终止线程,程序将继续运行,直到所有线程终止或某个线程调用exit()
,abort()
或终止程序的另一功能。
(2)使用return
作品,因为POSIX规范是这样说的。返回的值存储在pthread_join()
可以检索它的地方。在pthread_join()
调用之前,不会回收线程使用的资源。
(3)我从不在原始POSIX线程中使用线程的返回值。但是,我倾向于使用更高级别的工具,例如Boost线程库,以及最近使用的C ++
0x线程库,它们提供了在线程之间传递值(例如Future)的替代方法,从而避免了与内存管理相关的问题。暗示。
return语句用来从一个函数 返回 即跳出函数。我们也可选从函数 返回一个值 。 使用字面意义上的语句 例7.7 使用字面意义上的语句 #!/usr/bin/python # Filename: func_return.py defmaximum(x, y): ifx > y: returnx else: returny printmaximum(
我想在我的查询中调用一个函数。例如: 在我的myTableRepository中,我可以执行以下操作: 但向语句添加函数调用不起作用: 有没有办法让它在JPQL中工作? 我的错误:
问题内容: 今天在一次采访中有人问我这个问题。 “当我们使用(POSIX Threads)创建线程时,该线程将自行启动。为什么我们需要显式调用Java。为什么在创建实例时Java不启动该线程是什么原因。” 我很空白,面试官时间很短,最终他无法向我解释原因。 问题答案: 在Java中,不立即启动线程会导致获得更好的API。您可以在线程上设置属性(守护程序,优先级),而不必在构造函数中设置所有属性。
问题内容: 运行以下代码时(在Mac OS X 10.7的Mac上为Python 2.7.1) 我收到以下错误 我已经仔细检查了错误的制表符和/或空格。当我使用推荐的4个缩进空格时,可以确认代码失败并出现上述错误。当将返回值置于其他控制语句内时(例如,if,for等),也会发生此行为。 任何帮助,将不胜感激。谢谢! 问题答案: 在 返回 的语句才有意义,里面的功能:
到目前为止,我们创建的函数都只是对传入的数据进行了处理,处理完了就结束。但实际上,在某些场景中,我们还需函数将处理的结果反馈回来,就好像主管向下级员工下达命令,让其去打印文件,员工打印好文件后并没有完成任务,还需要将文件交给主管。 Python中,用 def 语句创建函数时,可以用 return 语句指定应该返回的值,该返回值可以是任意类型。需要注意的是,return 语句在同一函数中可以出现多次
当一个对象被创建时(当构造函数被调用时),有没有一种替代的方法来启动一个线程。我知道你不能在构造函数中启动线程。但是如果我在类中有两个方法(类被称为任务),它们实现了Runnable: run(),连续的Recv()。run()方法调用连续的Recv()函数。连续的Recv()做一些事情。然后我在公共类中创建了一个私有类,名为start ContRecv(),在构造函数调用中启动线程,就像这样 我