我pthread_mutex_t在我的程序中使用线程同步控制。当不再使用
时,我需要做一些整理工作吗?
或者说,我可以什么都不做吗?pthread_mutex_t
感谢您的帮助
我在网上读到,大多数现代 UNIX 系统默认都带有线程安全的 malloc()。我知道这仅仅意味着一个线程可以安全地调用 malloc(),而另一个线程已经处于 malloc() 调用本身的中间。
我正在使用 pthreads 进行多线程处理。我有一个 12 核 CPU,每个核 2 个线程。所以总共 24 个线程。另外,我正在使用 malloc 的 GNU C 库实现。
我的问题是关于在不锁定/等待/阻塞的情况下同时执行它们。我在一个答案中读到,当多个线程同时调用 malloc() 时,它“使用内部锁定机制”。
所以这就是我的问题:
如果 8 个线程恰好同时调用 malloc(),是否会有 8 个 malloc 调用并行发生,并且它们不会相互干扰?
或者当一个线程调用 malloc() 时,其他线程必须等待该线程的 malloc 调用完成才能继续执行自己的 malloc 调用?
(我问这个问题是因为我只是对我的一个 C 程序进行了多线程化,该程序确实广泛使用了 malloc() 和 free(),并且加速与所使用的线程不是线性的,尽管逻辑上它应该是线性的,因为没有一个线程依赖于任何全局的东西,所以不应该发生争用(无论如何在软件中)。我的场景很简单:每个线程调用一个函数,该函数在 1 个线程上大约需要 315 秒才能完成(无多线程),这使得数以百万计的其他调用我定义的函数。由于函数代码是只读的,因此并行运行此顶级函数的 X 线程的加速应该没有问题,因为每个线程都使用自己的参数调用它,并且没有线程依赖于任何东西全局或共享。当我使用 4 个线程时,由于某种原因,时间从 315 秒增加到 710 秒,而当我使用 8 个线程时,时间增加到 1400 秒,尽管每个线程都在做完全相同的工作。没有多线程的单线程正在执行,并且需要 315 秒才能完成。那么,到底是什么??)
我正在尝试用 C 语言为自己构建一个 Web 应用程序。到目前为止,我已经让 HTTP 服务器正常工作了,但是由于某种原因,当我有需要其他 CSS 的 HTML 文件和 JavaScript 文件时,浏览器(Firefox )会非常快地执行多个请求,导致服务器和客户端之间的套接字连接损坏。我尝试了许多不同的方法来让 HTTP 服务器正常工作,而不会生成损坏的 TCP 连接。
目前,我有一个循环调用accept,并为每个新连接创建一个新线程:
for(;;)
{
int newsockfd = accept(sockfd, (struct sockaddr *)&host_addr, (socklen_t *)&host_addrlen);
if(newsockfd < 0)
{
sendf(stderr, LOG_ERROR, "Failed to accept connection...\n");
continue;
}
pthread_t thread;
if(pthread_create(&thread, NULL, handler, (void *)&newsockfd) != 0)
{
sendf(stderr, LOG_ERROR, "Failed to create a new thread...\n");
return -4;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建线程,同时将套接字文件描述符(表示客户端和服务器之间的新连接)发送到新线程。
处理新创建的线程的函数如下所示:
void * handler(void * argument)
{
int sockfd = *((int *)argument);
struct …Run Code Online (Sandbox Code Playgroud) 我得到了一个评估,使用ncurses为Linux编写一个简单的聊天客户端.聊天有两个窗口:一个显示另一个客户端说的内容,另一个显示用户输入.
让我感到困惑的是如何处理不断来自套接字的数据并同时等待用户的输入.我想到的唯一一个解决方案就是使用pthreads,但我觉得我错过了一些更合适的东西.
有什么建议?
我想在c ++中实现线程化.我正在使用visual stdio2008并希望使用pthreads实现线程.任何人都可以指导我关于pthreads以及vs2008中的实现.感谢预期
Linux上的一个资源提到使用克隆系统调用实现pthread-create,而不是基于其他基于unix的平台(在其他方面实现相同).
这意味着在linux下,使用pthread_create从同一进程创建的两个线程将具有不同的父进程ID.
$ ./a.out
new thread: pid 6628 tid 1026 (0x402)
main thread: pid 6626 tid 1024 (0x400)
Run Code Online (Sandbox Code Playgroud)
题
如果我分离NSThread将Cocoa运行在一个单独的内存堆或内存区域?例如,如果我要分离一个线程,使用malloc创建一个大缓冲区,然后让线程退出,我会在某种自动线程清理中恢复该内存,还是会被泄露?
如果我使用POSIX线程(pthread)呢?
请注意,我对ObjC allocs或autorelease pool不感兴趣,我说的是低级缓冲区,例如int*foo = malloc(100000);
这可能是一个简单的查询.
当我们创建一个线程时,我们将(void*)t作为参数传递给函数PrintHello.we正在将tid中的指针threadid中的值复制(将其设置为long),这又是一个long变量.我很困惑参数传递.这是一个通过引用传递或通过值传递.所有这是正确的吗?
(value *)t.它究竟通过了什么价值?
long t;
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
Run Code Online (Sandbox Code Playgroud)
请帮我避免我的困惑:(
我正在使用pthreads编写一个多线程演示程序,其中一个线程将数据加载到STL队列,另一个线程从中读取.听起来很琐碎,对吗?不幸的是,推入队列的数据正在消失.我不是多线程的新手,也不熟悉内存结构 - 然而,这让我很难过.
这些是我对队列本身的声明以及保护它的互斥锁,它们位于客户端代码包含的标头中:
static std::queue<int32_t> messageQueue;
static pthread_mutex_t messageQueueLock;
Run Code Online (Sandbox Code Playgroud)
程序启动时,它会使用进程共享属性初始化互斥锁:
pthread_mutexattr_t sharedAttr;
pthread_mutexattr_init(&sharedAttr);
pthread_mutexattr_setpshared(&sharedAttr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&messageQueueLock, &sharedAttr);
Run Code Online (Sandbox Code Playgroud)
然后它启动'生产者'线程和'消费者'线程,并让他们做他们的事情.生产者线程将新项目推送到队列,然后进入休眠状态.以下是向队列添加内容的行:
pthread_mutex_lock(&messageQueueLock);
messageQueue.push(message);
pthread_mutex_unlock(&messageQueueLock);
Run Code Online (Sandbox Code Playgroud)
然后它休眠并让消费者线程接管.但是,当使用者线程检查队列中的项目时,队列是神奇的空.
我已经使用gdb介绍了该程序.以下是我跑步的输出.您可以看到生产者向队列添加内容的位置,我打印队列的大小以确保它在那里,有一个上下文切换到消费者线程,我再次打印队列的大小,它是空的.看看这个:
(gdb) b main_ex.cpp:70
Breakpoint 1 at 0x100006a24: file main_ex.cpp, line 70.
(gdb) run
Starting program: a.out
Reading symbols for shared libraries ++. done
Creating the mutex.
Producer thread starting up.
PRODUCER: Creating a message to send.
PRODUCER: Adding the message to the queue.
[Switching to process 7432]
Breakpoint 1, yourProcess () at main_ex.cpp:70
70 pthread_mutex_lock(&messageQueueLock);
(gdb) …Run Code Online (Sandbox Code Playgroud) 好的,所以如果我在Linux上运行子线程(如果重要的话使用pthreads),我运行以下命令
kill(getpid(), someSignal);
Run Code Online (Sandbox Code Playgroud)
它会将给定的信号发送给当前线程的父节点.
我的问题:在kill()运行后面的语句之前,是否保证父母会立即获得CPU并处理信号(如果是SIGKILL则杀死应用程序,或者如果是其他信号则执行其他任何操作)?或者是否可能 - 甚至可能 - kill()在父线程处理信号之前,任何后续命令都会运行?