.loc
использует индексирование на основе меток для выбора строк и столбцов. Метки являются значениями индекса или столбцов. Нарезка с .loc
включает последний элемент.
Предположим, что у нас есть DataFrame со следующими столбцами:
blockquote>foo
,bar
,quz
,ant
,cat
,sat
,dat
.# selects all rows and all columns beginning at 'foo' up to and including 'sat' df.loc[:, 'foo':'sat'] # foo bar quz ant cat sat
.loc
принимает ту же самую нотацию фрагментов, что и списки Python для строк и столбцов. Обозначение фрагмента:start:stop:step
# slice from 'foo' to 'cat' by every 2nd column df.loc[:, 'foo':'cat':2] # foo quz cat # slice from the beginning to 'bar' df.loc[:, :'bar'] # foo bar # slice from 'quz' to the end by 3 df.loc[:, 'quz'::3] # quz sat # attempt from 'sat' to 'bar' df.loc[:, 'sat':'bar'] # no columns returned # slice from 'sat' to 'bar' df.loc[:, 'sat':'bar':-1] sat cat ant quz bar # slice notation is syntatic sugar for the slice function # slice from 'quz' to the end by 2 with slice function df.loc[:, slice('quz',None, 2)] # quz cat dat # select specific columns with a list # select columns foo, bar and dat df.loc[:, ['foo','bar','dat']] # foo bar dat
Вы можете срезать по строкам и столбцам. Например, если у вас есть 5 строк с метками
v
,w
,x
,y
,z
# slice from 'w' to 'y' and 'foo' to 'ant' by 3 df.loc['w':'y', 'foo':'ant':3] # foo ant # w # x # y
Похоже, у вас есть два вопроса:
Ответ: Это напрямую поддерживается pthreads - сделайте свой поток -be-stop JOINABLE (при первом запуске) и использовать pthread_join (), чтобы заблокировать текущий поток до тех пор, пока поток, который будет остановлен, больше не будет запущен.
Ответ: вы можете добавить флаг «thread_complete», чтобы выполнить трюк:
Сценарий: Thread A хочет знать, жив ли Thread B .
Когда создается поток B, ему присваивается указатель на флаг «thread_complete». Флаг «thread_complete» должен быть инициализирован до NOT_COMPLETED до создания потока. Функция точки входа Thread B должна немедленно вызвать pthread_cleanup_push (), чтобы нажать «обработчик очистки», который устанавливает флаг «thread_complete» в COMPLETED.
Подробнее о обработчиках очистки см. Здесь: обработчики очистки pthread
Вы хотите включить соответствующий вызов pthread_cleanup_pop (1), чтобы гарантировать, что обработчик очистки будет вызван независимо от того, что (т. е. если поток нормально выходит из строя ИЛИ из-за отмены и т. д.).
Затем Thread A может просто проверить флаг «thread_complete», чтобы увидеть, еще ли вышел поток B.
ПРИМЕЧАНИЕ. Ваш флаг «thread_complete» должен быть объявлен «изменчивым» и должен быть атомный тип - компиляторы GNU предоставляют sig_atomic_t для этой цели. Это позволяет двум потокам согласовывать одни и те же данные без необходимости в конструкциях синхронизации (мьютексы / семафоры).
pthread_kill(tid, 0);
Сигнал не отправляется, но проверка ошибок по-прежнему выполняется, поэтому вы можете использовать это для проверки существования tid.
ВНИМАНИЕ: этот ответ неверен. В стандарте конкретно запрещается передавать идентификатор потока, срок службы которого закончился. Этот идентификатор теперь может указывать другой поток или, что еще хуже, он может ссылаться на освобожденную память, вызывая сбой.
Не существует полностью портативного решения, посмотрите, поддерживает ли ваша платформа pthread_tryjoin_np или pthread_timedjoin_np. Поэтому вы просто проверяете, может ли поток быть присоединен (конечно, созданный с помощью PTHREAD_CREATE_JOINABLE).
Я думаю, что вам действительно нужно называть pthread_join (). Этот вызов не будет возвращен до тех пор, пока поток не выйдет.
Если вы хотите только опросить, будет ли поток работать или нет (и обратите внимание, что обычно это не то, что вам нужно делать! ), у вас может быть поток, задающий volatile boolean на false, прежде чем он выйдет ... тогда ваш основной поток мог бы прочитать логическое значение, и если это все еще верно, вы знаете, что поток все еще работает. (если это ложь, с другой стороны, вы знаете, что поток, по крайней мере, почти ушел, он все равно может запускать код очистки, который возникает после того, как он устанавливает логическое значение в false, хотя, тем не менее, даже в этом случае вам все равно следует вызвать pthread_join before пытаясь освободить любые ресурсы, к которым у потока может быть доступ)
Позвольте мне отметить «выигрышный» ответ, который имеет огромный скрытый недостаток, и в некоторых контекстах это может привести к сбоям. Если вы не используете pthread_join, он будет появляться снова и снова. Предположим, что у вас есть процесс и общая библиотека. Вызовите библиотеку lib.so.
Позвольте мне отметить, что это не проблема с hipothetical, у меня была такая же проблема в нашем проекте.
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
void* thread1 (void* arg);
void* thread2 (void* arg);
int main()
{
pthread_t thr_id;
pthread_create(&thr_id, NULL, thread1, NULL);
sleep(10);
}
void* thread1 (void* arg)
{
pthread_t thr_id = 0;
pthread_create(&thr_id, NULL, thread2, NULL);
sleep(5);
int ret = 0;
if( (ret = pthread_kill(thr_id, 0)) == 0)
{
printf("still running\n");
pthread_join(thr_id, NULL);
}
else
{
printf("RIP Thread = %d\n",ret);
}
}
void* thread2 (void* arg)
{
// sleep(5);
printf("I am done\n");
}