首先,我使用pthread库编写多线程C程序.线程总是被等待的互斥锁挂起.当我使用strace实用程序查找线程处于FUTEX_WAIT状态时,我想知道当时哪个线程持有该互斥锁.但我不知道怎么能做到.有没有公用事业可以做到这一点?
有人告诉我Java虚拟机支持这个,所以我想知道Linux是否支持这个功能.
我使用pthread_create创建了几个子线程.一次,主线程想要杀死所有子线程或者会有段falut.我应该用哪种功能来完成它?我从谷歌搜索了答案,得到了像pthread_kill这样的功能.但是我不知道应该向子线程发送哪个信号来杀死它们.我的运行环境是RHEL 5.4,编程语言是C.
好吧,rand_r函数应该是一个线程安全的函数.但是,通过它的实现,我无法相信它本身不能被其他线程改变.假设两个线程将使用相同的变量种子同时调用rand_r.所以会发生读写比赛.由glibc实现的代码rand_r如下所示.谁知道为什么rand_r被称为线程安全?
int
rand_r (unsigned int *seed)
{
unsigned int next = *seed;
int result;
next *= 1103515245;
next += 12345;
result = (unsigned int) (next / 65536) % 2048;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next / 65536) % 1024;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next / 65536) % 1024;
*seed = next;
return result;
}
Run Code Online (Sandbox Code Playgroud) 当我使用Linux套接字程序时,我遇到有关select函数的问题.如果客户端在服务器配置的时间间隔内连接服务器端,那么select函数工作正常.如果超时发生,select函数将永远返回0.那时,我调试客户端,发现客户端已连接到服务器.但是select函数仍然返回0.我已经搜索了这个问题,但没有找到任何帮助.有人知道为什么选择那样吗?我的linux版本是RHEL5.4.谢谢您的帮助.
代码如下所示.
static const int maxLog = 10000;
int main()
{
int servSock;
signal(SIGPIPE, SIG_IGN);
if((servSock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
printf("socket create fail\n");
exit(-1);
}
int val = 1;
if(setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))<0)
{
DieWithUserMessage("setsockopt error");
}
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(22000);
if(bind(servSock, (struct sockaddr *) &serverAddr,
sizeof(serverAddr)) < 0)
{
printf("socket bind fail\n");
exit(-1);
}
if(listen(servSock, maxLog) < 0)
{
printf("listen failed\n");
exit(-1);
} …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个关于在linux环境中将进程设置为一个核心的项目.我使用sched_setaffinity来完成这项工作,我想知道linux是否提供了一些函数来获取进程运行的核心.我使用top命令,发现它可以使用j选项获取此信息.所以我相信有一些方法可以在用户空间中获取此信息.