如何确定分离的pthread是否还活着?
我有一个与线程的通信通道(从线程向外指向的单向队列)但是如果线程在没有喘息的情况下死亡会发生什么?
我应该让自己使用过程信号,还是可以以某种方式探测线程的活力?
编译多线程程序我们使用gcc如下:
gcc -lpthread -D_REENTRANT -o someprogram someprogram.c
Run Code Online (Sandbox Code Playgroud)
国旗到底在-D_REENTRANT做什么?
我创建了一个线程,并将其置于无限循环中.使用valgrind检查代码时出现内存泄漏.这是我的代码:
#include <pthread.h>
#include <time.h>
void thread_do(void){
while(1){}
}
int main(){
pthread_t th;
pthread_create(&th, NULL, (void *)thread_do, NULL);
sleep(2);
/* I want to kill thread here */
sleep(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以在main中创建一个线程,并且一直运行thread_do().有没有办法在2秒后从主内部杀死它?我试过了两次pthread_detach(th),pthread_cancel(th)但我仍然有泄漏.
我有一个在给定机器上顺利运行的c ++项目,现在我正在尝试使用相同的操作系统(Xubuntu 14.04)在另一个上编译它.
我已经安装了所有的依赖项,我使用cmake来构建项目,尽管它因以下错误而停止:
确定pthreads中是否存在函数pthread_create失败,输出如下:.../usr/bin/ld:找不到-lpthreads
包含编译器标志的cmakelists.txt行如下:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_C_FLAGS_DEBUG "-g -O0 -Wall -lpthread -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -O3 -lpthread -I/usr/include/freetype2 -DNDEBUG -DEIGEN_MPL2_ONLY")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall -lpthread -I/usr/include/freetype2 -DEIGEN_MPL2_ONLY")
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,已经尝试过以下方法:
-used -pthread/-threads/-thread/-lpthreads而不是-lpthread,它不能解决问题并使构建停止而不会找到以下包:
find_package (Threads)
我会很感激一些帮助,因为我已经很想知道下一步该尝试什么.
编辑1
图书馆应该在哪里:
$ find /lib -name "*pthread*"
/lib/x86_64-linux-gnu/libpthread-2.19.so
/lib/x86_64-linux-gnu/libpthread.so.0
Run Code Online (Sandbox Code Playgroud)
还发现了pthread_create:
$ nm /lib/x86_64-linux-gnu/libpthread.so.0 | grep "pthread_create"
0000000000008430 t __pthread_create_2_1
00000000000081430 T pthread_create@@GLIBC_2.2.5
Run Code Online (Sandbox Code Playgroud)
我还验证了libpthread-stubs0和libc6-dev都存在.
编辑2
这是FindThreads.cmake文件内容的一部分,位于/usr/share/cmake-2.8/Modules/中:
if(CMAKE_HAVE_SPROC_H AND NOT CMAKE_THREAD_PREFER_PTHREAD) …Run Code Online (Sandbox Code Playgroud) #include <iostream>
#include <map>
#include <thread>
#define SIZE 1024
#define AMOUNT 100000
#define THREADS 4
class A
{
private:
char a[SIZE];
};
void test()
{
std::cout << "test start\n";
std::map<int, A*> container;
for(int i=0; i<AMOUNT; i++)
{
A* a = new A();
std::pair<int, A*>p = std::make_pair(i, a);
container.insert(p);
}
std::cout << "test release\n";
for(int i=0; i<AMOUNT; i++)
{
auto iter = container.find(i);
delete iter->second;
container.erase(iter);
}
std::cout << "test end\n";
}
int main()
{
std::thread ts[THREADS];
for(int i=0; i<THREADS; i++) …Run Code Online (Sandbox Code Playgroud) 我有一些在Linux上使用PThreads的线程代码,我怀疑它正遭受过多的锁争用.有哪些工具可供我测量?
Solaris有DTrace和plockstat.Linux上有类似的东西吗?(我知道Linux最近的DTrace端口,但它似乎还没有为黄金时间做好准备.)
过去没有线程经验,C++中的线程技术对于初学者来说是最简单的吗?boost :: thread还是pthreads?
以下程序显示我们可以使用return()或pthread_exit()返回可用于pthread_join()的状态变量的void*变量.
(1)是否应优先使用一个而不是另一个?
(2)为什么使用return()有效?通常我们会想到返回将值放在堆栈上但是由于线程已经完成,堆栈应该消失.或者堆栈是否在pthread_join()之后才被销毁?
(3)在你的工作中,你是否看到很多地方变量的使用?我看到90%的代码看起来只是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 …Run Code Online (Sandbox Code Playgroud) 它是在POSIX线程教程https://computing.llnl.gov/tutorials/pthreads/ 中编写的 ,这是一个逻辑错误.
我的问题是为什么它是一个逻辑错误?
在我的程序中,我需要使用这些信号,但是我不能保证会有一个处于_cond_wait状态的线程.我试图测试它,没有任何反应.这会导致意外行为还是更糟?
谢谢!
我对使用线程知之甚少,但我查看了php的pthreads,它看起来非常有趣,容易,或者比我想象的更容易......
我搜索了一些示例并查看了文档,但是我找不到任何真实世界的例子,说明何时使用线程实际上是有益的,它确实适用于不依赖于彼此的长任务,例如执行许多http请求或也许发送邮件.
但是写日志条目怎么样?插入数据库?(比如跟踪用户活动)从数据库中获取(我可以从线程返回数据吗?)
这会增加性能还是过多地创建线程的开销?(虽然我可以使用工作池也可以减少开销,我认为...)
任何建议或例子都非常感谢!