【发布时间】:2011-06-21 22:10:06
【问题描述】:
我最近在尝试将一些多线程功能添加到我的一些代码中以用于工作项目时注意到的是,pthread 在后勤处理方面是一个巨大的痛苦......
这是场景...
我的主方法(服务器)中有一个无限循环,只要它从任何客户端接收到数据包,就会产生线程来处理数据。问题是我根本无法让线程同时执行。他们拒绝开始执行,直到从 main 方法调用 pthread_join() ,这完全破坏了首先使用线程的全部目的(服务器需要停止执行流程,并等待线程在接收之前完成处理其数据不再有数据包!荒谬。)
那么有没有办法使用 pthread 并让它们实际上是多线程的?还是我最好完全不使用线程,并通过在我的服务器中停止执行来调用函数来处理数据来节省额外的资源?
我在想我可能每次都不得不求助于分叉......
这令人沮丧....
我做的一些示例代码如下:
// gcc threads.c -lpthread
#include <stdio.h>
#include <pthread.h>
struct point{
int x, y;
};
static void *print_point(void *point_p);
int main() {
pthread_t tid;
struct point pt = {3, 5};
printf("enter main\n");
pthread_create(&tid, NULL, print_point, &pt);
while(1){continue;}
return 0;
}
static void *print_point(void *point_p) {
struct point arg = * (struct point *) point_p;
printf("Point: (%d, %d)\n", arg.x, arg.y);
return NULL;
}
当我运行并编译它时(是的,我使用 -lpthread 开关编译),它打印“进入 main”并且不执行线程......我什至让它运行了一段时间(起床,去上厕所,吃了点东西),还是什么都没有。
所以由于 main 方法产生一个线程然后无限循环,线程最终应该执行......对吗?从我的测试中可以看出,主方法永远不会放弃对它产生的线程的执行。我可以通过调用 join 让它放弃它的唯一方法(但这违背了拥有线程的目的,因为 main 会一直等到线程完成)。
【问题讨论】:
-
这对我来说很好。尽管在
main函数中设置忙等待循环可能是不可取的;改用大号sleep。 -
对于这个特定的示例,请确保刷新标准输出。否则,该短字符串将位于输出缓冲区中,但尚未打印到屏幕上,因为 I/O 系统在打印任何内容之前正在等待更多数据。不过,这不应该是您的服务器程序的问题。
-
@Rob:stdout 不会自动刷新到换行符吗?
-
像
while(1){continue;}这样的紧密循环可能会导致调度问题。相反,使用sleep来确保操作系统有机会重新安排。确保您在服务器应用程序中执行此操作,这可能是问题所在(尽管在您的服务器中您可能正在等待select或其他东西?) -
+1 对 Oli 的评论:使用睡眠来强制上下文切换。使用 while(true) 循环无法保证您这样做。
标签: c++ c multithreading pthreads