./threadid.c: 行 4: pthread_t: 未找到命令
时间: 2023-09-13 17:09:56 浏览: 69
这个错误提示是因为在你的代码中使用了 pthread_t 类型,但是在编译的时候没有连接 pthread 库。
要解决这个问题,你需要在编译的时候链接 pthread 库。在 gcc 编译的时候,你需要添加 -pthread 选项,例如:
```
gcc -pthread threadid.c -o threadid
```
这样就能够正确链接 pthread 库,解决这个问题了。
相关问题
请解决以上代码在Ubuntu运行中出现的以下问题:called object ‘pthread_create’ is not a function or function pointer pthread_create(&mole_threads[i], NULL, mole_thread, &i);
在Ubuntu运行中出现 "called object ‘pthread_create’ is not a function or function pointer" 的错误,通常是由于没有正确链接线程库引起的。为了解决这个问题,你可以在编译时添加 `-pthread` 选项来显式链接线程库。以下是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <stdbool.h>
#include <time.h>
#define SCREEN_WIDTH 40
#define SCREEN_HEIGHT 20
char screen[SCREEN_HEIGHT][SCREEN_WIDTH];
pthread_mutex_t screen_mutex = PTHREAD_MUTEX_INITIALIZER;
int score = 0;
typedef struct {
int x;
int y;
} Hole;
Hole holes[5];
void init_screen() {
for (int i = 0; i < SCREEN_HEIGHT; i++) {
for (int j = 0; j < SCREEN_WIDTH; j++) {
screen[i][j] = ' ';
}
}
}
void display_screen() {
system("clear");
for (int i = 0; i < SCREEN_HEIGHT; i++) {
for (int j = 0; j < SCREEN_WIDTH; j++) {
printf("%c", screen[i][j]);
}
printf("\n");
}
printf("Score: %d\n", score);
}
void update_screen(int x, int y, char character) {
pthread_mutex_lock(&screen_mutex);
screen[y][x] = character;
pthread_mutex_unlock(&screen_mutex);
}
void clear_screen(int x, int y) {
pthread_mutex_lock(&screen_mutex);
screen[y][x] = ' ';
pthread_mutex_unlock(&screen_mutex);
}
void* mole_thread(void* arg) {
int index = *(int*) arg;
srand(time(NULL) + index); // 根据线程索引设置随机种子
while (true) {
int x = rand() % SCREEN_WIDTH;
int y = rand() % SCREEN_HEIGHT;
update_screen(x, y, 'M');
usleep(500000); // 线程休眠0.5秒
clear_screen(x, y);
usleep(500000);
}
return NULL;
}
void* player_thread(void* arg) {
char input;
while (true) {
scanf(" %c", &input);
if (input == 'q') {
break;
}
if (input == 'h') {
pthread_mutex_lock(&screen_mutex);
for (int i = 0; i < 5; i++) {
if (screen[holes[i].y][holes[i].x] == 'M') {
score++;
clear_screen(holes[i].x, holes[i].y);
}
}
pthread_mutex_unlock(&screen_mutex);
}
}
return NULL;
}
int main() {
init_screen();
// 创建地鼠洞
srand(time(NULL));
for (int i = 0; i < 5; i++) {
holes[i].x = rand() % SCREEN_WIDTH;
holes[i].y = rand() % SCREEN_HEIGHT;
}
// 创建地鼠线程
pthread_t mole_threads[5];
for (int i = 0; i < 5; i++) {
pthread_create(&mole_threads[i], NULL, mole_thread, &i);
}
// 创建玩家线程
pthread_t player_thread_id;
pthread_create(&player_thread_id, NULL, player_thread, NULL);
// 游戏循环
while (true) {
display_screen();
usleep(100000); // 刷新屏幕间隔0.1秒
}
// 等待线程结束
for (int i = 0; i < 5; i++) {
pthread_join(mole_threads[i], NULL);
}
pthread_join(player_thread_id, NULL);
return 0;
}
```
在编译时使用以下命令来链接线程库:
```shell
gcc -o game game.c -pthread
```
这样应该就能解决 "called object ‘pthread_create’ is not a function or function pointer" 的问题了。
程序beta.c的源码如下:#include<stdio.h> #include<pthread.h> void *do_loop(void *data) { int i,j; int me=*((int *)data); for(i=0;i<10;i++){ for(j=0;j<50000000;j++); printf("'%d'-Got '%d'\n",me,i); } getchar(); pthread_exit(NULL); } int main(int argc,char *argv[]) { int thread_id; pthread_t p_thread; int a =1; int b =2; thread_id=pthread_create(&p_thread,NULL,do_loop,(void *)&a); do_loop((void *)&b); return 0; }[1] 使用下列命令创建可执行程序文件: $ gcc -o beta beta.c -lpthread [2] 执行该程序文件,并使用top命令显示该程序执行的所有线程,要求显示包含下列字段: pid、tty、nth、tgid、command [3] 使用ps命令显示该程序执行时,包含LWP列的所有线程信息
很好,您的问题是关于程序beta.c的源码和线程相关的命令。下面是回答:
1. 源码解释:
程序beta.c是一个使用pthread库来创建两个线程的C程序。其中,do_loop函数是线程函数,它会循环运行10次,并在每次循环中打印线程编号和循环次数。main函数中调用pthread_create函数来创建一个新线程,并将线程函数do_loop作为参数传递给它,同时还创建了一个新的线程,直接调用do_loop函数。最后,main函数返回0,程序结束。
2. top命令显示线程信息:
使用下列命令执行程序beta并使用top命令显示线程信息:
```
$ ./beta
$ top -H -p $(pgrep beta)
```
其中,-H选项表示显示线程信息,-p选项后跟进程ID,表示只显示该进程的线程信息。pgrep命令用于查找进程ID。
显示结果中,pid表示线程ID,tgid表示进程ID,nth表示线程编号,tty表示终端信息,command表示进程命令行。
3. ps命令显示线程信息:
使用下列命令执行程序beta并使用ps命令显示线程信息:
```
$ ./beta &
$ ps -eLf | grep beta
```
其中,&符号表示在后台执行程序,ps命令用于显示进程信息,-eLf选项表示显示包含LWP列的所有线程信息,grep命令用于查找包含字符串"beta"的行。
显示结果中,UID表示用户ID,PID表示进程ID,LWP表示线程ID,TTY表示终端信息,TIME表示线程运行时间,CMD表示进程命令行。
阅读全文